INT-3209 DefaultFileNameGenerator - SpEL Parsing
JIRA: https://jira.springsource.org/browse/INT-3209 Previously, the DefaultFileNameGenerator re-parsed the SpEL expression for every message. Compile the SpEL once (and if it is changed). Change unit tests to match changes.
This commit is contained in:
committed by
Artem Bilan
parent
a7d4d57090
commit
703b24541f
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2010 the original author or authors.
|
||||
* Copyright 2002-2013 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.
|
||||
@@ -18,6 +18,9 @@ package org.springframework.integration.file;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.expression.ExpressionParser;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
import org.springframework.integration.Message;
|
||||
import org.springframework.integration.util.AbstractExpressionEvaluator;
|
||||
import org.springframework.util.Assert;
|
||||
@@ -34,13 +37,17 @@ import org.springframework.util.StringUtils;
|
||||
* associated with the header if no expression has been provided), it checks if
|
||||
* the Message payload is a File instance, and if so, it uses the same name.
|
||||
* Finally, it falls back to the Message ID and adds the suffix '.msg'.
|
||||
*
|
||||
*
|
||||
* @author Mark Fisher
|
||||
* @author Gary Russell
|
||||
*/
|
||||
public class DefaultFileNameGenerator extends AbstractExpressionEvaluator implements FileNameGenerator {
|
||||
|
||||
private volatile String expression = "headers['" + FileHeaders.FILENAME + "']";
|
||||
private static final String DEFAULT_EXPRESSION = "headers['" + FileHeaders.FILENAME + "']";
|
||||
|
||||
private final static ExpressionParser parser = new SpelExpressionParser();
|
||||
|
||||
private volatile Expression expression = parser.parseExpression(DEFAULT_EXPRESSION);
|
||||
|
||||
/**
|
||||
* Specify an expression to be evaluated against the Message
|
||||
@@ -48,7 +55,7 @@ public class DefaultFileNameGenerator extends AbstractExpressionEvaluator implem
|
||||
*/
|
||||
public void setExpression(String expression) {
|
||||
Assert.hasText(expression, "expression must not be empty");
|
||||
this.expression = expression;
|
||||
this.expression = parser.parseExpression(expression);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -57,9 +64,10 @@ public class DefaultFileNameGenerator extends AbstractExpressionEvaluator implem
|
||||
*/
|
||||
public void setHeaderName(String headerName) {
|
||||
Assert.notNull(headerName, "'headerName' must not be null");
|
||||
this.expression = "headers['" + headerName + "']";
|
||||
this.expression = parser.parseExpression("headers['" + headerName + "']");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String generateFileName(Message<?> message) {
|
||||
Object filenameProperty = this.evaluateExpression(this.expression, message);
|
||||
if (filenameProperty instanceof String && StringUtils.hasText((String) filenameProperty)) {
|
||||
|
||||
@@ -122,6 +122,17 @@ public class DefaultFileNameGeneratorTests {
|
||||
assertEquals("bar", filename);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customExpressionTakesPrecedenceOverFilePayload() {
|
||||
DefaultFileNameGenerator generator = new DefaultFileNameGenerator();
|
||||
generator.setBeanFactory(mock(BeanFactory.class));
|
||||
generator.setExpression("'foobar'");
|
||||
File payload = new File("/some/path/ignore");
|
||||
Message<?> message = MessageBuilder.withPayload(payload).build();
|
||||
String filename = generator.generateFileName(message);
|
||||
assertEquals("foobar", filename);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customHeaderNameTakesPrecedenceOverDefault() {
|
||||
DefaultFileNameGenerator generator = new DefaultFileNameGenerator();
|
||||
|
||||
@@ -106,9 +106,9 @@ public class FileOutboundChannelAdapterParserTests {
|
||||
assertThat(actual, is(expected));
|
||||
DefaultFileNameGenerator fileNameGenerator = (DefaultFileNameGenerator) handlerAccessor.getPropertyValue("fileNameGenerator");
|
||||
assertNotNull(fileNameGenerator);
|
||||
String expression = (String) TestUtils.getPropertyValue(fileNameGenerator, "expression");
|
||||
Expression expression = TestUtils.getPropertyValue(fileNameGenerator, "expression", Expression.class);
|
||||
assertNotNull(expression);
|
||||
assertEquals("'foo.txt'", expression);
|
||||
assertEquals("'foo.txt'", expression.getExpressionString());
|
||||
assertEquals(Boolean.FALSE, handlerAccessor.getPropertyValue("deleteSourceFiles"));
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import java.io.File;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
@@ -93,9 +94,9 @@ public class FileOutboundGatewayParserTests {
|
||||
assertEquals(Boolean.TRUE, handlerAccessor.getPropertyValue("requiresReply"));
|
||||
DefaultFileNameGenerator fileNameGenerator = (DefaultFileNameGenerator) handlerAccessor.getPropertyValue("fileNameGenerator");
|
||||
assertNotNull(fileNameGenerator);
|
||||
String expression = (String) TestUtils.getPropertyValue(fileNameGenerator, "expression");
|
||||
Expression expression = TestUtils.getPropertyValue(fileNameGenerator, "expression", Expression.class);
|
||||
assertNotNull(expression);
|
||||
assertEquals("'foo.txt'", expression);
|
||||
assertEquals("'foo.txt'", expression.getExpressionString());
|
||||
|
||||
Long sendTimeout = TestUtils.getPropertyValue(handler, "messagingTemplate.sendTimeout", Long.class);
|
||||
assertEquals(Long.valueOf(777), sendTimeout);
|
||||
|
||||
@@ -108,8 +108,9 @@ public class OutboundChannelAdapterParserTests {
|
||||
assertNotNull(remoteDirectoryExpression);
|
||||
assertEquals("'foo' + '/' + 'bar'", remoteDirectoryExpression.getExpressionString());
|
||||
FileNameGenerator generator = (FileNameGenerator) TestUtils.getPropertyValue(handler, "remoteFileTemplate.fileNameGenerator");
|
||||
String fileNameGeneratorExpression = (String) TestUtils.getPropertyValue(generator, "expression");
|
||||
assertEquals("payload.getName() + '-foo'", fileNameGeneratorExpression);
|
||||
Expression fileNameGeneratorExpression = TestUtils.getPropertyValue(generator, "expression", Expression.class);
|
||||
assertNotNull(fileNameGeneratorExpression);
|
||||
assertEquals("payload.getName() + '-foo'", fileNameGeneratorExpression.getExpressionString());
|
||||
assertEquals("UTF-8", TestUtils.getPropertyValue(handler, "remoteFileTemplate.charset"));
|
||||
assertNull(TestUtils.getPropertyValue(handler, "remoteFileTemplate.temporaryDirectoryExpressionProcessor"));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user