diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java b/spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java index 4904c9377d..e871406970 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/locking/FileChannelCache.java @@ -30,6 +30,7 @@ import java.util.concurrent.ConcurrentMap; * * @author Iwein Fuld * @author Gary Russell + * @author Emmanuel Roux * @since 2.0 */ final class FileChannelCache { @@ -51,7 +52,7 @@ final class FileChannelCache { */ public static FileLock tryLockFor(File fileToLock) throws IOException { FileChannel channel = channelCache.get(fileToLock); - if (channel == null) { + if (channel == null && fileToLock.exists()) { @SuppressWarnings("resource") FileChannel newChannel = new RandomAccessFile(fileToLock, "rw").getChannel(); FileChannel original = channelCache.putIfAbsent(fileToLock, newChannel); diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileChannelCacheTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileChannelCacheTests.java new file mode 100644 index 0000000000..4c3b8c62f4 --- /dev/null +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileChannelCacheTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2019 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 + * + * https://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.file.locking; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +/** + * @author Emmanuel Roux + * @since 4.3.22 + */ +public class FileChannelCacheTests { + + @Rule + public TemporaryFolder temp = new TemporaryFolder(); + + @Test + public void noLockWhenFileNotExists() throws IOException { + File testFile = new File(this.temp.getRoot(), "test0"); + assertFalse(testFile.exists()); + assertNull(FileChannelCache.tryLockFor(testFile)); + assertFalse(testFile.exists()); + } + + @Test + public void fileLocked() throws IOException { + File testFile = this.temp.newFile("test1"); + assertTrue(testFile.exists()); + assertNotNull(FileChannelCache.tryLockFor(testFile)); + FileChannelCache.closeChannelFor(testFile); + } + +} diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java index cd9bd4cfa7..3694c5e843 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java @@ -17,6 +17,7 @@ package org.springframework.integration.file.locking; import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -36,6 +37,7 @@ import org.springframework.integration.test.util.TestUtils; /** * @author Iwein Fuld * @author Gary Russell + * @author Emmanuel Roux */ public class NioFileLockerTests { @@ -77,4 +79,21 @@ public class NioFileLockerTests { filter1.unlock(testFile); } + @Test + public void fileLockedWhenNotAlreadyLockedAndExists() throws IOException { + NioFileLocker locker = new NioFileLocker(); + File testFile = new File(this.workdir, "test2"); + testFile.createNewFile(); + assertTrue(locker.lock(testFile)); + locker.unlock(testFile); + } + + @Test + public void fileNotLockedWhenNotExists() { + NioFileLocker locker = new NioFileLocker(); + File testFile = new File(this.workdir, "test3"); + assertFalse(locker.lock(testFile)); + assertFalse(testFile.exists()); + } + }