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:
committed by
Artem Bilan
parent
c8aafde20b
commit
2b99c191f6
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user