diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpInboundSynchronizer.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpInboundSynchronizer.java index 7370636016..2a3969ac9e 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpInboundSynchronizer.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpInboundSynchronizer.java @@ -28,7 +28,7 @@ import org.springframework.integration.MessagingException; import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSychronizer; import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSynchronizingMessageSource; import org.springframework.integration.sftp.session.SftpSession; -import org.springframework.integration.sftp.session.SftpSessionPool; +import org.springframework.integration.sftp.session.SftpSessionFactory; import org.springframework.util.Assert; import com.jcraft.jsch.ChannelSftp; @@ -53,12 +53,12 @@ public class SftpInboundSynchronizer extends AbstractInboundRemoteFileSystemSych /** * the pool of {@link org.springframework.integration.sftp.session.SftpSessionPool} SFTP sessions */ - private final SftpSessionPool sessionPool; + private final SftpSessionFactory sessionFactory; - public SftpInboundSynchronizer(SftpSessionPool sessionPool) { - Assert.notNull(sessionPool, "'sessionPool' must not be null"); - this.sessionPool = sessionPool; + public SftpInboundSynchronizer(SftpSessionFactory sessionFactory) { + Assert.notNull(sessionFactory, "sessionFactory must not be null"); + this.sessionFactory = sessionFactory; } @@ -94,7 +94,7 @@ public class SftpInboundSynchronizer extends AbstractInboundRemoteFileSystemSych return true; } catch (Throwable th) { - if (this.autoCreateDirectories && (this.sessionPool != null) && (session != null)) { + if (this.autoCreateDirectories && (this.sessionFactory != null) && (session != null)) { try { if (channelSftp != null) { channelSftp.mkdir(remotePath); @@ -110,7 +110,6 @@ public class SftpInboundSynchronizer extends AbstractInboundRemoteFileSystemSych catch (Exception e){ throw new MessagingException("Failed to auto-create remote directory", e); } - } } return false; @@ -121,8 +120,10 @@ public class SftpInboundSynchronizer extends AbstractInboundRemoteFileSystemSych protected void syncRemoteToLocalFileSystem(Resource localDirectory) { SftpSession session = null; try { - session = sessionPool.getSession(); - logger.trace("Pooled SftpSession " + this.sessionPool + " from the pool"); + session = this.sessionFactory.getSession(); + if (logger.isTraceEnabled()) { + logger.trace("Pooled SftpSession " + session + " from the pool"); + } session.connect(); this.checkThatRemotePathExists(remotePath, session); ChannelSftp channelSftp = session.getChannel(); @@ -140,8 +141,10 @@ public class SftpInboundSynchronizer extends AbstractInboundRemoteFileSystemSych throw new MessagingException("couldn't synchronize remote to local directory", e); } finally { - this.sessionPool.release(session); - logger.trace("Putting SftpSession " + this.sessionPool + " back into the pool"); + session.disconnect(); + if (logger.isTraceEnabled()) { + logger.trace("Putting SftpSession " + session + " back into the pool"); + } } } diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/outbound/SftpSendingMessageHandler.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/outbound/SftpSendingMessageHandler.java index f9a71cd2a2..4b3d4194a6 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/outbound/SftpSendingMessageHandler.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/outbound/SftpSendingMessageHandler.java @@ -38,7 +38,7 @@ import org.springframework.integration.file.FileNameGenerator; import org.springframework.integration.handler.AbstractMessageHandler; import org.springframework.integration.handler.ExpressionEvaluatingMessageProcessor; import org.springframework.integration.sftp.session.SftpSession; -import org.springframework.integration.sftp.session.SftpSessionPool; +import org.springframework.integration.sftp.session.SftpSessionFactory; import org.springframework.util.Assert; import org.springframework.util.FileCopyUtils; import org.springframework.util.StringUtils; @@ -57,7 +57,7 @@ public class SftpSendingMessageHandler extends AbstractMessageHandler { private static final String TEMPORARY_FILE_SUFFIX = ".writing"; - private final SftpSessionPool sessionPool; + private final SftpSessionFactory sessionFactory; private volatile ExpressionEvaluatingMessageProcessor directoryExpressionProcesor; @@ -72,9 +72,9 @@ public class SftpSendingMessageHandler extends AbstractMessageHandler { private volatile String charset = Charset.defaultCharset().name(); - public SftpSendingMessageHandler(SftpSessionPool sessionPool) { - Assert.notNull(sessionPool, "'sessionPool' must not be null"); - this.sessionPool = sessionPool; + public SftpSendingMessageHandler(SftpSessionFactory sessionFactory) { + Assert.notNull(sessionFactory, "sessionFactory must not be null"); + this.sessionFactory = sessionFactory; } @@ -165,7 +165,7 @@ public class SftpSendingMessageHandler extends AbstractMessageHandler { } private boolean sendFileToRemoteEndpoint(Message message, File file) throws Exception { - SftpSession session = this.sessionPool.getSession(); + SftpSession session = this.sessionFactory.getSession(); if (session == null) { throw new MessagingException("The session returned from the pool is null, cannot proceed."); } @@ -189,7 +189,7 @@ public class SftpSendingMessageHandler extends AbstractMessageHandler { } finally { IOUtils.closeQuietly(fileInputStream); - this.sessionPool.release(session); + session.disconnect(); } } diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/QueuedSftpSessionPool.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/QueuedSftpSessionPool.java index bbc9309ab4..c5c2641b8c 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/QueuedSftpSessionPool.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/QueuedSftpSessionPool.java @@ -35,7 +35,7 @@ import com.jcraft.jsch.Channel; * @author Oleg Zhurakousky * @since 2.0 */ -public class QueuedSftpSessionPool implements SftpSessionPool, SmartLifecycle { +public class QueuedSftpSessionPool implements SftpSessionFactory, SmartLifecycle { private static Logger logger = Logger.getLogger(QueuedSftpSessionPool.class.getName()); diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSessionPool.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSessionPool.java deleted file mode 100644 index d6742f47f1..0000000000 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/SftpSessionPool.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2002-2010 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.integration.sftp.session; - -import org.springframework.context.Lifecycle; - -/** - * Holds instances of {@link SftpSession} since they are stateful - * and might be in use while another operation runs. - * - * @author Josh Long - * @author Oleg Zhurakousky - * @since 2.0 - */ -public interface SftpSessionPool extends SftpSessionFactory, Lifecycle { - - /** - * Returns a session that can be used to connect to an sftp instance and perform operations - * - * @return the session from the pool ready to be connected to. - * @throws Exception if any fault occurs when trying to connect to the remote server - */ - SftpSession getSession(); - - /** - * Releases the session. - * - * @param session the session to relinquish / renew - */ - void release(SftpSession session); - -} diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/config/OutboundChannelAdapaterParserTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/config/OutboundChannelAdapaterParserTests.java index a75a2ea971..5d0370f832 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/config/OutboundChannelAdapaterParserTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/config/OutboundChannelAdapaterParserTests.java @@ -56,8 +56,8 @@ public class OutboundChannelAdapaterParserTests { assertEquals("UTF-8", TestUtils.getPropertyValue(handler, "charset")); assertNotNull(TestUtils.getPropertyValue(handler, "temporaryBufferFolder")); assertNotNull(TestUtils.getPropertyValue(handler, "temporaryBufferFolderFile")); - QueuedSftpSessionPool clientPoll = (QueuedSftpSessionPool) TestUtils.getPropertyValue(handler, "sessionPool"); - SimpleSftpSessionFactory clientFactory = (SimpleSftpSessionFactory) TestUtils.getPropertyValue(clientPoll, "sftpSessionFactory"); + QueuedSftpSessionPool sessionFactory = (QueuedSftpSessionPool) TestUtils.getPropertyValue(handler, "sessionFactory"); + SimpleSftpSessionFactory clientFactory = (SimpleSftpSessionFactory) TestUtils.getPropertyValue(sessionFactory, "sftpSessionFactory"); assertEquals("localhost", TestUtils.getPropertyValue(clientFactory, "host")); assertEquals(2222, TestUtils.getPropertyValue(clientFactory, "port")); } diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizerTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizerTests.java index 1c5926e3bb..c59ac78133 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizerTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizerTests.java @@ -10,6 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ + package org.springframework.integration.sftp.impl; import static junit.framework.Assert.assertTrue; @@ -23,12 +24,13 @@ import java.lang.reflect.Method; import org.junit.Before; import org.junit.Test; + import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.integration.file.synchronization.AbstractInboundRemoteFileSystemSychronizer.EntryAcknowledgmentStrategy; import org.springframework.integration.sftp.inbound.SftpInboundSynchronizer; import org.springframework.integration.sftp.session.SftpSession; -import org.springframework.integration.sftp.session.SftpSessionPool; +import org.springframework.integration.sftp.session.SftpSessionFactory; import org.springframework.util.ReflectionUtils; import com.jcraft.jsch.ChannelSftp; @@ -36,7 +38,7 @@ import com.jcraft.jsch.ChannelSftp.LsEntry; /** * @author Oleg Zhurakousky - * + * @since 2.0 */ public class SftpInboundRemoteFileSystemSynchronizerTests { @Before @@ -63,7 +65,7 @@ public class SftpInboundRemoteFileSystemSynchronizerTests { */ @Test public void testCopyAndRenameWhenLocalFileExists() throws Exception { - SftpInboundSynchronizer synchronizer = new SftpInboundSynchronizer(mock(SftpSessionPool.class)); + SftpInboundSynchronizer synchronizer = new SftpInboundSynchronizer(mock(SftpSessionFactory.class)); Method method = ReflectionUtils.findMethod(synchronizer.getClass(), "copyFromRemoteToLocalDirectory", SftpSession.class, LsEntry.class, Resource.class); method.setAccessible(true); @@ -85,7 +87,7 @@ public class SftpInboundRemoteFileSystemSynchronizerTests { @org.junit.Ignore @Test public void testCopyAndRenameWhenLocalFileDoesntExist() throws Exception { - SftpInboundSynchronizer synchronizer = new SftpInboundSynchronizer(mock(SftpSessionPool.class)); + SftpInboundSynchronizer synchronizer = new SftpInboundSynchronizer(mock(SftpSessionFactory.class)); synchronizer.setEntryAcknowledgmentStrategy(mock(EntryAcknowledgmentStrategy.class)); Method method = ReflectionUtils.findMethod(synchronizer.getClass(), "copyFromRemoteToLocalDirectory", SftpSession.class, LsEntry.class, Resource.class); diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpInboundRemoteFileSystemSynchronizerTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpInboundRemoteFileSystemSynchronizerTests.java index 6916f4f35d..cc21a2f420 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpInboundRemoteFileSystemSynchronizerTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpInboundRemoteFileSystemSynchronizerTests.java @@ -32,7 +32,7 @@ import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.integration.file.filters.FileListFilter; import org.springframework.integration.sftp.session.SftpSession; -import org.springframework.integration.sftp.session.SftpSessionPool; +import org.springframework.integration.sftp.session.SftpSessionFactory; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.ChannelSftp.LsEntry; @@ -50,8 +50,8 @@ public class SftpInboundRemoteFileSystemSynchronizerTests { if (file.exists()){ file.delete(); } - SftpSessionPool sessionPool = mock(SftpSessionPool.class); - SftpInboundSynchronizer syncronizer = new SftpInboundSynchronizer(sessionPool); + SftpSessionFactory sessionFactory = mock(SftpSessionFactory.class); + SftpInboundSynchronizer syncronizer = new SftpInboundSynchronizer(sessionFactory); syncronizer.setRemotePath("foo/bar"); FileListFilter filter = mock(FileListFilter.class); @@ -61,7 +61,7 @@ public class SftpInboundRemoteFileSystemSynchronizerTests { SftpSession sftpSession = mock(SftpSession.class); - when(sessionPool.getSession()).thenReturn(sftpSession); + when(sessionFactory.getSession()).thenReturn(sftpSession); ChannelSftp channel = mock(ChannelSftp.class); when(channel.get((String) Mockito.any())).thenReturn(new FileInputStream(new File("template.mf"))); when(sftpSession.getChannel()).thenReturn(channel); @@ -82,7 +82,7 @@ public class SftpInboundRemoteFileSystemSynchronizerTests { Resource localDirectory = new FileSystemResource(System.getProperty("java.io.tmpdir")); syncronizer.syncRemoteToLocalFileSystem(localDirectory); - verify(sessionPool, times(1)).getSession(); + verify(sessionFactory, times(1)).getSession(); verify(sftpSession, atLeast(1)).getChannel(); // will add more validation, but for now this test is mainly to get the test coverage up } diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/outbound/SftpSendingMessageHandlerTest.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/outbound/SftpSendingMessageHandlerTest.java index 7318b31248..660c237328 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/outbound/SftpSendingMessageHandlerTest.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/outbound/SftpSendingMessageHandlerTest.java @@ -28,7 +28,7 @@ import org.junit.Test; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.sftp.session.SftpSession; -import org.springframework.integration.sftp.session.SftpSessionPool; +import org.springframework.integration.sftp.session.SftpSessionFactory; import com.jcraft.jsch.ChannelSftp; @@ -42,43 +42,43 @@ public class SftpSendingMessageHandlerTest { @SuppressWarnings({ "unchecked", "rawtypes" }) @Test public void testHandleFileNameMessage() throws Exception { - SftpSessionPool sessionPoll = mock(SftpSessionPool.class); + SftpSessionFactory sessionFactory = mock(SftpSessionFactory.class); SftpSession session = mock(SftpSession.class); ChannelSftp channel = mock(ChannelSftp.class); when(session.getChannel()).thenReturn(channel); - when(sessionPoll.getSession()).thenReturn(session); - SftpSendingMessageHandler handler = new SftpSendingMessageHandler(sessionPoll); + when(sessionFactory.getSession()).thenReturn(session); + SftpSendingMessageHandler handler = new SftpSendingMessageHandler(sessionFactory); handler.setRemoteDirectoryExpression(new SpelExpressionParser().parseExpression("'foo.txt'")); handler.handleMessage(new GenericMessage("hello")); verify(session, atLeast(1)).getChannel(); - verify(sessionPoll, times(1)).getSession(); + verify(sessionFactory, times(1)).getSession(); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Test public void testHandleFileAsByte() throws Exception { - SftpSessionPool sessionPoll = mock(SftpSessionPool.class); + SftpSessionFactory sessionFactory = mock(SftpSessionFactory.class); SftpSession session = mock(SftpSession.class); ChannelSftp channel = mock(ChannelSftp.class); when(session.getChannel()).thenReturn(channel); - when(sessionPoll.getSession()).thenReturn(session); - SftpSendingMessageHandler handler = new SftpSendingMessageHandler(sessionPoll); + when(sessionFactory.getSession()).thenReturn(session); + SftpSendingMessageHandler handler = new SftpSendingMessageHandler(sessionFactory); handler.setRemoteDirectoryExpression(new SpelExpressionParser().parseExpression("'foo.txt'")); handler.handleMessage(new GenericMessage("hello".getBytes())); verify(session, atLeast(1)).getChannel(); - verify(sessionPoll, times(1)).getSession(); + verify(sessionFactory, times(1)).getSession(); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Test public void testHandleFileMessage() throws Exception { - SftpSessionPool sessionPoll = mock(SftpSessionPool.class); + SftpSessionFactory sessionFactory = mock(SftpSessionFactory.class); SftpSession session = mock(SftpSession.class); ChannelSftp channel = mock(ChannelSftp.class); when(session.getChannel()).thenReturn(channel); - when(sessionPoll.getSession()).thenReturn(session); - SftpSendingMessageHandler handler = new SftpSendingMessageHandler(sessionPoll); + when(sessionFactory.getSession()).thenReturn(session); + SftpSendingMessageHandler handler = new SftpSendingMessageHandler(sessionFactory); handler.setRemoteDirectoryExpression(new SpelExpressionParser().parseExpression("'foo.txt'")); handler.handleMessage(new GenericMessage("hello".getBytes())); @@ -87,6 +87,6 @@ public class SftpSendingMessageHandlerTest { File file = File.createTempFile("foo", ".txt"); handler.handleMessage(new GenericMessage(file)); verify(session, atLeast(1)).getChannel(); - verify(sessionPoll, atLeast(1)).getSession(); + verify(sessionFactory, atLeast(1)).getSession(); } }