GH-3076: NioFileLocker: add file existence check
Fixes spring-projects/spring-integration#3076 * Return `null` instead of throwing an exception * Fix license header * Add missing `@since` * Avoid over-engineered test logic * Fix code style * Test non-existent file does not get created * Fix: remove unused import * Remove Java 8 constructions; revert AssertJ to regular JUnit assertions
This commit is contained in:
committed by
Artem Bilan
parent
9c24e161c1
commit
88908167bb
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user