INT-4740: FileSplitter - Add Headers

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

For `File` and `String` payloads add `FileHeaders.ORIGINAL_FILE` and `FileHeaders.FILENAME` headers.

Reworked to create headers once only.

Fix typos and Java > 6  API usage
This commit is contained in:
Gary Russell
2015-06-15 09:57:45 -04:00
committed by Artem Bilan
parent 6436aa6d32
commit 3d5f7db4b2
3 changed files with 65 additions and 4 deletions

View File

@@ -19,7 +19,9 @@ package org.springframework.integration.splitter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
@@ -27,7 +29,6 @@ import org.springframework.integration.support.AbstractIntegrationMessageBuilder
import org.springframework.integration.util.Function;
import org.springframework.integration.util.FunctionIterator;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
/**
* Base class for Message-splitting handlers.
@@ -86,21 +87,28 @@ public abstract class AbstractMessageSplitter extends AbstractReplyProducingMess
return null;
}
final MessageHeaders headers = message.getHeaders();
final Object correlationId = headers.getId();
Map<String, Object> messageHeaders = message.getHeaders();
if (willAddHeaders(message)) {
messageHeaders = new HashMap<String, Object>(messageHeaders);
addHeaders(message, messageHeaders);
}
final Map<String, Object> headers = messageHeaders;
final Object correlationId = message.getHeaders().getId();
final AtomicInteger sequenceNumber = new AtomicInteger(1);
return new FunctionIterator<Object, AbstractIntegrationMessageBuilder<?>>(iterator,
new Function<Object, AbstractIntegrationMessageBuilder<?>>() {
@Override
public AbstractIntegrationMessageBuilder<?> apply(Object object) {
return createBuilder(object, headers, correlationId, sequenceNumber.getAndIncrement(),
sequenceSize);
}
});
}
private AbstractIntegrationMessageBuilder<?> createBuilder(Object item, MessageHeaders headers,
private AbstractIntegrationMessageBuilder<?> createBuilder(Object item, Map<String, Object> headers,
Object correlationId, int sequenceNumber, int sequenceSize) {
AbstractIntegrationMessageBuilder<?> builder;
if (item instanceof Message) {
@@ -116,6 +124,26 @@ public abstract class AbstractMessageSplitter extends AbstractReplyProducingMess
return builder;
}
/**
* Return true if the subclass needs to add headers in the resulting splits.
* If true, {@link #addHeaders} will be called.
* @param message the message.
* @return true
*/
protected boolean willAddHeaders(Message<?> message) {
return false;
}
/**
* Allows subclasses to add extra headers to the output messages. Headers may not be
* removed by this method.
*
* @param message the inbound message.
* @param headers the headers to add messages to.
*/
protected void addHeaders(Message<?> message, Map<String, Object> headers) {
}
@Override
protected boolean shouldCopyRequestHeaders() {
return false;