INT-1167, INT-836 added 'shouldSkipNulls' option to HeaderEnricher and refactored XPathHeaderEnricher to extend from the core HeaderEnricher

This commit is contained in:
Mark Fisher
2010-06-11 20:30:11 +00:00
parent 6acce320b4
commit 16fab7af81
3 changed files with 78 additions and 77 deletions

View File

@@ -49,12 +49,14 @@ public class HeaderEnricher implements Transformer {
private static final Log logger = LogFactory.getLog(HeaderEnricher.class);
private final Map<String, ValueHolder> headersToAdd;
private final Map<String, ? extends ValueHolder> headersToAdd;
private volatile MessageProcessor messageProcessor;
private volatile boolean defaultOverwrite = false;
private volatile boolean shouldSkipNulls = true;
public HeaderEnricher() {
this(null);
@@ -63,7 +65,7 @@ public class HeaderEnricher implements Transformer {
/**
* Create a HeaderEnricher with the given map of headers.
*/
public HeaderEnricher(Map<String, ValueHolder> headersToAdd) {
public HeaderEnricher(Map<String, ? extends ValueHolder> headersToAdd) {
this.headersToAdd = (headersToAdd != null) ? headersToAdd : new HashMap<String, ValueHolder>();
}
@@ -76,19 +78,29 @@ public class HeaderEnricher implements Transformer {
this.defaultOverwrite = defaultOverwrite;
}
/**
* Specify whether <code>null</code> values, such as might be returned from an expression evaluation,
* should be skipped. The default value is <code>true</code>. Set this to <code>false</false> if a
* <code>null</code> value should trigger <i>removal</i> of the corresponding header instead.
*/
public void setShouldSkipNulls(boolean shouldSkipNulls) {
this.shouldSkipNulls = shouldSkipNulls;
}
public Message<?> transform(Message<?> message) {
try {
Map<String, Object> headerMap = new HashMap<String, Object>(message.getHeaders());
this.addHeadersFromMessageProcessor(message, headerMap);
for (Map.Entry<String, ValueHolder> entry : this.headersToAdd.entrySet()) {
for (Map.Entry<String, ? extends ValueHolder> entry : this.headersToAdd.entrySet()) {
String key = entry.getKey();
ValueHolder valueHolder = entry.getValue();
Boolean shouldOverwrite = valueHolder.isOverwrite();
if (shouldOverwrite == null) {
shouldOverwrite = this.defaultOverwrite;
}
if (shouldOverwrite || headerMap.get(key) == null) {
headerMap.put(key, valueHolder.evaluate(message));
Object value = valueHolder.evaluate(message);
if ((value != null && shouldOverwrite) || headerMap.get(key) == null || (value == null && !this.shouldSkipNulls)) {
headerMap.put(key, value);
}
}
return MessageBuilder.withPayload(message.getPayload()).copyHeaders(headerMap).build();