INT-4297: Add FileSplitter.setFirstLineAsHeader()
JIRA: https://jira.spring.io/browse/INT-4297 * Add `FileSplitter.setFirstLineAsHeader()` and extract the first line from the context before `iterator`. * Populate the extracted header to each subsequent line * Don't use `Streams` to read first line * Add XSD and Java DSL option for the `firstLineAsHeader` * Document the feature * Add Java DSL sample for the `Files.slitter()` Add a note about more complex header enrichment Doc Polishing and fix field name.
This commit is contained in:
committed by
Gary Russell
parent
5216dc2b02
commit
d8382e0bd0
@@ -1,26 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:int="http://www.springframework.org/schema/integration"
|
||||
xmlns:int-file="http://www.springframework.org/schema/integration/file"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:int="http://www.springframework.org/schema/integration"
|
||||
xmlns:int-file="http://www.springframework.org/schema/integration/file"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/integration/file http://www.springframework.org/schema/integration/file/spring-integration-file.xsd
|
||||
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd">
|
||||
|
||||
<int:channel id="out" />
|
||||
<int:channel id="out"/>
|
||||
|
||||
<int-file:splitter id="fullBoat"
|
||||
iterator="false"
|
||||
markers="true"
|
||||
markers-json="true"
|
||||
apply-sequence="true"
|
||||
requires-reply="true"
|
||||
charset="UTF-8"
|
||||
input-channel="in"
|
||||
output-channel="out"
|
||||
send-timeout="5"
|
||||
auto-startup="false"
|
||||
order="2"
|
||||
phase="1" />
|
||||
iterator="false"
|
||||
markers="true"
|
||||
markers-json="true"
|
||||
apply-sequence="true"
|
||||
requires-reply="true"
|
||||
charset="UTF-8"
|
||||
first-line-as-header="foo"
|
||||
input-channel="in"
|
||||
output-channel="out"
|
||||
send-timeout="5"
|
||||
auto-startup="false"
|
||||
order="2"
|
||||
phase="1"/>
|
||||
|
||||
</beans>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015-2016 the original author or authors.
|
||||
* Copyright 2015-2017 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.
|
||||
@@ -36,6 +36,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
* @author Artem Bilan
|
||||
*
|
||||
* @since 4.2
|
||||
*
|
||||
*/
|
||||
@@ -67,7 +69,7 @@ public class FileSplitterParserTests {
|
||||
assertEquals(5L, TestUtils.getPropertyValue(this.splitter, "messagingTemplate.sendTimeout"));
|
||||
assertEquals(this.out, TestUtils.getPropertyValue(this.splitter, "outputChannel"));
|
||||
assertEquals(2, TestUtils.getPropertyValue(this.splitter, "order"));
|
||||
|
||||
assertEquals("foo", TestUtils.getPropertyValue(this.splitter, "firstLineHeaderName"));
|
||||
assertEquals(this.in, TestUtils.getPropertyValue(this.fullBoat, "inputChannel"));
|
||||
assertFalse(TestUtils.getPropertyValue(this.fullBoat, "autoStartup", Boolean.class));
|
||||
assertEquals(1, TestUtils.getPropertyValue(this.fullBoat, "phase"));
|
||||
|
||||
@@ -307,6 +307,64 @@ public class FileSplitterTests {
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFirstLineAsHeader() {
|
||||
QueueChannel outputChannel = new QueueChannel();
|
||||
FileSplitter splitter = new FileSplitter(true, true);
|
||||
splitter.setFirstLineAsHeader("firstLine");
|
||||
splitter.setOutputChannel(outputChannel);
|
||||
splitter.handleMessage(new GenericMessage<>(file));
|
||||
Message<?> received = outputChannel.receive(0);
|
||||
assertNotNull(received);
|
||||
assertNull(received.getHeaders().get(IntegrationMessageHeaderAccessor.SEQUENCE_SIZE));
|
||||
assertNull(received.getHeaders().get("firstLine"));
|
||||
assertEquals("START", received.getHeaders().get(FileHeaders.MARKER));
|
||||
assertThat(received.getPayload(), instanceOf(FileSplitter.FileMarker.class));
|
||||
FileMarker fileMarker = (FileSplitter.FileMarker) received.getPayload();
|
||||
assertEquals(FileSplitter.FileMarker.Mark.START, fileMarker.getMark());
|
||||
assertEquals(file.getAbsolutePath(), fileMarker.getFilePath());
|
||||
received = outputChannel.receive(0);
|
||||
assertEquals("HelloWorld", received.getHeaders().get("firstLine"));
|
||||
assertNotNull(received);
|
||||
received = outputChannel.receive(0);
|
||||
assertNotNull(received);
|
||||
assertEquals("END", received.getHeaders().get(FileHeaders.MARKER));
|
||||
assertNull(received.getHeaders().get("firstLine"));
|
||||
assertThat(received.getPayload(), instanceOf(FileSplitter.FileMarker.class));
|
||||
fileMarker = (FileSplitter.FileMarker) received.getPayload();
|
||||
assertEquals(FileSplitter.FileMarker.Mark.END, fileMarker.getMark());
|
||||
assertEquals(file.getAbsolutePath(), fileMarker.getFilePath());
|
||||
assertEquals(1, fileMarker.getLineCount());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFirstLineAsHeaderOnlyHeader() throws IOException {
|
||||
QueueChannel outputChannel = new QueueChannel();
|
||||
FileSplitter splitter = new FileSplitter(true, true);
|
||||
splitter.setFirstLineAsHeader("firstLine");
|
||||
splitter.setOutputChannel(outputChannel);
|
||||
File file = File.createTempFile("empty", ".txt");
|
||||
splitter.handleMessage(new GenericMessage<>(file));
|
||||
Message<?> received = outputChannel.receive(0);
|
||||
assertNotNull(received);
|
||||
assertNull(received.getHeaders().get(IntegrationMessageHeaderAccessor.SEQUENCE_SIZE));
|
||||
assertNull(received.getHeaders().get("firstLine"));
|
||||
assertEquals("START", received.getHeaders().get(FileHeaders.MARKER));
|
||||
assertThat(received.getPayload(), instanceOf(FileSplitter.FileMarker.class));
|
||||
FileMarker fileMarker = (FileSplitter.FileMarker) received.getPayload();
|
||||
assertEquals(FileSplitter.FileMarker.Mark.START, fileMarker.getMark());
|
||||
assertEquals(file.getAbsolutePath(), fileMarker.getFilePath());
|
||||
received = outputChannel.receive(0);
|
||||
assertNotNull(received);
|
||||
assertEquals("END", received.getHeaders().get(FileHeaders.MARKER));
|
||||
assertNull(received.getHeaders().get("firstLine"));
|
||||
assertThat(received.getPayload(), instanceOf(FileSplitter.FileMarker.class));
|
||||
fileMarker = (FileSplitter.FileMarker) received.getPayload();
|
||||
assertEquals(FileSplitter.FileMarker.Mark.END, fileMarker.getMark());
|
||||
assertEquals(file.getAbsolutePath(), fileMarker.getFilePath());
|
||||
assertEquals(0, fileMarker.getLineCount());
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableIntegration
|
||||
@ImportResource("classpath:org/springframework/integration/file/splitter/FileSplitterTests-context.xml")
|
||||
|
||||
Reference in New Issue
Block a user