INT-4117: File Outbound Set File Permissions

JIRA: https://jira.spring.io/browse/INT-4117

Add an option to set file permissions on the `FileWritingMessageHandler` when the file system supports it.

Polishing - PR Comments; more robust file system detection.

Add DSL support and fix NPE with missing timestamp header.

Fix javadoc

Fix javadoc

Some polishing:

* Add `chmod >= 0` assertion
* Make some assertion with string concatenation as `Supplier`-based to
deffer that string concatenation
This commit is contained in:
Gary Russell
2017-05-22 21:00:31 -04:00
committed by Artem Bilan
parent c8aafde20b
commit 2b99c191f6
13 changed files with 234 additions and 23 deletions

View File

@@ -46,7 +46,10 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
@@ -61,9 +64,11 @@ import org.junit.rules.TemporaryFolder;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.expression.Expression;
import org.springframework.integration.channel.NullChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.file.support.FileExistsMode;
import org.springframework.integration.file.support.FileUtils;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.messaging.Message;
@@ -123,10 +128,40 @@ public class FileWritingMessageHandlerTests {
}
@Test
public void supportedType() throws Exception {
public void permissions() {
if (FileUtils.IS_POSIX) {
FileWritingMessageHandler handler = new FileWritingMessageHandler(mock(Expression.class));
handler.setChmod(0421);
Set<?> permissions = TestUtils.getPropertyValue(handler, "permissions", Set.class);
assertThat(permissions.size(), equalTo(3));
assertTrue(permissions.contains(PosixFilePermission.OWNER_READ));
assertTrue(permissions.contains(PosixFilePermission.GROUP_WRITE));
assertTrue(permissions.contains(PosixFilePermission.OTHERS_EXECUTE));
handler.setChmod(0600);
permissions = TestUtils.getPropertyValue(handler, "permissions", Set.class);
assertThat(permissions.size(), equalTo(2));
assertTrue(permissions.contains(PosixFilePermission.OWNER_READ));
assertTrue(permissions.contains(PosixFilePermission.OWNER_WRITE));
handler.setChmod(0777);
permissions = TestUtils.getPropertyValue(handler, "permissions", Set.class);
assertThat(permissions.size(), equalTo(9));
}
}
@Test
public void supportedTypeAndPermissions() throws Exception {
if (FileUtils.IS_POSIX) {
handler.setChmod(0777);
}
handler.setOutputChannel(new NullChannel());
handler.handleMessage(new GenericMessage<String>("test"));
assertThat(outputDirectory.listFiles()[0], notNullValue());
File[] output = outputDirectory.listFiles();
assertThat(output.length, equalTo(1));
assertThat(output[0], notNullValue());
if (FileUtils.IS_POSIX) {
Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(output[0].toPath());
assertThat(permissions.size(), equalTo(9));
}
}
@Test

View File

@@ -17,6 +17,7 @@
channel="testChannel"
directory="${java.io.tmpdir}"
temporary-file-suffix=".foo"
chmod="777"
filename-generator-expression="'foo.txt'"/>
<file:outbound-channel-adapter id="adapterWithCustomNameGenerator"

View File

@@ -17,6 +17,7 @@
package org.springframework.integration.file.config;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
@@ -26,6 +27,7 @@ import static org.junit.Assert.assertTrue;
import java.io.File;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -41,6 +43,7 @@ import org.springframework.integration.file.DefaultFileNameGenerator;
import org.springframework.integration.file.FileWritingMessageHandler;
import org.springframework.integration.file.FileWritingMessageHandler.MessageFlushPredicate;
import org.springframework.integration.file.support.FileExistsMode;
import org.springframework.integration.file.support.FileUtils;
import org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.messaging.Message;
@@ -140,6 +143,9 @@ public class FileOutboundChannelAdapterParserTests {
assertEquals("'foo.txt'", expression.getExpressionString());
assertEquals(Boolean.FALSE, handlerAccessor.getPropertyValue("deleteSourceFiles"));
assertEquals(Boolean.TRUE, handlerAccessor.getPropertyValue("flushWhenIdle"));
if (FileUtils.IS_POSIX) {
assertThat(TestUtils.getPropertyValue(handler, "permissions", Set.class).size(), equalTo(9));
}
}
@Test

View File

@@ -17,6 +17,7 @@
package org.springframework.integration.file.dsl;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
@@ -74,6 +75,7 @@ import org.springframework.integration.file.filters.ChainFileListFilter;
import org.springframework.integration.file.filters.ExpressionFileListFilter;
import org.springframework.integration.file.splitter.FileSplitter;
import org.springframework.integration.file.support.FileExistsMode;
import org.springframework.integration.file.support.FileUtils;
import org.springframework.integration.file.tail.ApacheCommonsFileTailingMessageProducer;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.integration.test.util.TestUtils;
@@ -240,6 +242,9 @@ public class FileTests {
endsWith(TestUtils.applySystemFileSeparator("fileWritingFlow/foo.write")));
String fileContent = StreamUtils.copyToString(new FileInputStream(resultFile), Charset.defaultCharset());
assertEquals(payload, fileContent);
if (FileUtils.IS_POSIX) {
assertThat(java.nio.file.Files.getPosixFilePermissions(resultFile.toPath()).size(), equalTo(9));
}
}
@Autowired
@@ -389,7 +394,9 @@ public class FileTests {
return IntegrationFlows.from("fileWritingInput")
.enrichHeaders(h -> h.header(FileHeaders.FILENAME, "foo.write")
.header("directory", new File(tmpDir.getRoot(), "fileWritingFlow")))
.handle(Files.outboundGateway(m -> m.getHeaders().get("directory")))
.handle(Files.outboundGateway(m -> m.getHeaders().get("directory"))
.preserveTimestamp(true)
.chmod(0777))
.channel(MessageChannels.queue("fileWritingResultChannel"))
.get();
}