diff --git a/org.springframework.integration.file/src/main/java/org/springframework/integration/file/DefaultFileNameGenerator.java b/org.springframework.integration.file/src/main/java/org/springframework/integration/file/DefaultFileNameGenerator.java index 0f7b83a18f..0cb861650a 100644 --- a/org.springframework.integration.file/src/main/java/org/springframework/integration/file/DefaultFileNameGenerator.java +++ b/org.springframework.integration.file/src/main/java/org/springframework/integration/file/DefaultFileNameGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 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. @@ -19,22 +19,39 @@ package org.springframework.integration.file; import java.io.File; import org.springframework.integration.core.Message; +import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** * Default implementation of the filename generator strategy. It first checks - * for the "filename" Message header. Next, 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'. + * for a message header whose name matches its 'headerName' property. The + * default header name is defined by the constant {@link FileHeaders#FILENAME}. + * A custom header name can be provided via {@link #setHeaderName(String)}. If + * no String-typed value is associated with that header 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 */ public class DefaultFileNameGenerator implements FileNameGenerator { + private volatile String headerName = FileHeaders.FILENAME; + + + /** + * Specify a custom header name to check for the file name. + * The default is defined by {@link FileHeaders#FILENAME}. + */ + public void setHeaderName(String headerName) { + Assert.notNull(headerName, "'headerName' must not be null"); + this.headerName = headerName; + } + public String generateFileName(Message message) { - String filenameProperty = message.getHeaders().get(FileHeaders.FILENAME, String.class); - if (StringUtils.hasText(filenameProperty)) { - return filenameProperty; + Object filenameProperty = message.getHeaders().get(this.headerName); + if (filenameProperty instanceof String + && StringUtils.hasText((String) filenameProperty)) { + return (String) filenameProperty; } if (message.getPayload() instanceof File) { return ((File) message.getPayload()).getName(); diff --git a/org.springframework.integration.file/src/main/java/org/springframework/integration/file/FileHeaders.java b/org.springframework.integration.file/src/main/java/org/springframework/integration/file/FileHeaders.java index ae10471a07..d6fdcdcc7c 100644 --- a/org.springframework.integration.file/src/main/java/org/springframework/integration/file/FileHeaders.java +++ b/org.springframework.integration.file/src/main/java/org/springframework/integration/file/FileHeaders.java @@ -26,7 +26,7 @@ import org.springframework.integration.core.MessageHeaders; */ public abstract class FileHeaders { - public static final String PREFIX = MessageHeaders.PREFIX + "file_"; + private static final String PREFIX = MessageHeaders.PREFIX + "file_"; public static final String FILENAME = PREFIX + "name"; diff --git a/org.springframework.integration.file/src/test/java/org/springframework/integration/file/DefaultFileNameGeneratorTests.java b/org.springframework.integration.file/src/test/java/org/springframework/integration/file/DefaultFileNameGeneratorTests.java new file mode 100644 index 0000000000..8a57b15e1a --- /dev/null +++ b/org.springframework.integration.file/src/test/java/org/springframework/integration/file/DefaultFileNameGeneratorTests.java @@ -0,0 +1,141 @@ +/* + * Copyright 2002-2009 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.file; + +import static org.junit.Assert.assertEquals; + +import java.io.File; + +import org.junit.Test; + +import org.springframework.integration.core.Message; +import org.springframework.integration.message.MessageBuilder; + +/** + * @author Mark Fisher + */ +public class DefaultFileNameGeneratorTests { + + @Test + public void defaultHeaderNamePresent() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + Message message = MessageBuilder.withPayload("test") + .setHeader(FileHeaders.FILENAME, "foo").build(); + String filename = generator.generateFileName(message); + assertEquals("foo", filename); + } + + @Test + public void defaultHeaderNameNotPresent() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + Message message = MessageBuilder.withPayload("test").build(); + String filename = generator.generateFileName(message); + assertEquals(message.getHeaders().getId() + ".msg", filename); + } + + @Test + public void defaultHeaderNameNotString() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + Message message = MessageBuilder.withPayload("test") + .setHeader(FileHeaders.FILENAME, new Integer(123)).build(); + String filename = generator.generateFileName(message); + assertEquals(message.getHeaders().getId() + ".msg", filename); + } + + @Test + public void customHeaderNamePresent() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + generator.setHeaderName("foo"); + Message message = MessageBuilder.withPayload("test") + .setHeader("foo", "bar").build(); + String filename = generator.generateFileName(message); + assertEquals("bar", filename); + } + + @Test + public void customHeaderNameNotPresent() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + generator.setHeaderName("foo"); + Message message = MessageBuilder.withPayload("test").build(); + String filename = generator.generateFileName(message); + assertEquals(message.getHeaders().getId() + ".msg", filename); + } + + @Test + public void customHeaderNameNotString() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + generator.setHeaderName("foo"); + Message message = MessageBuilder.withPayload("test") + .setHeader("foo", new Integer(123)).build(); + String filename = generator.generateFileName(message); + assertEquals(message.getHeaders().getId() + ".msg", filename); + } + + @Test + public void filePayloadPresent() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + File payload = new File("/some/path/foo"); + Message message = MessageBuilder.withPayload(payload).build(); + String filename = generator.generateFileName(message); + assertEquals("foo", filename); + } + + @Test + public void defaultHeaderNameTakesPrecedenceOverFilePayload() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + File payload = new File("/some/path/ignore"); + Message message = MessageBuilder.withPayload(payload) + .setHeader(FileHeaders.FILENAME, "foo").build(); + String filename = generator.generateFileName(message); + assertEquals("foo", filename); + } + + @Test + public void customHeaderNameTakesPrecedenceOverFilePayload() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + generator.setHeaderName("foo"); + File payload = new File("/some/path/ignore"); + Message message = MessageBuilder.withPayload(payload) + .setHeader("foo", "bar").build(); + String filename = generator.generateFileName(message); + assertEquals("bar", filename); + } + + @Test + public void customHeaderNameTakesPrecedenceOverDefault() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + generator.setHeaderName("foo"); + Message message = MessageBuilder.withPayload("test") + .setHeader(FileHeaders.FILENAME, "ignore") + .setHeader("foo", "bar").build(); + String filename = generator.generateFileName(message); + assertEquals("bar", filename); + } + + @Test + public void customHeaderNameTakesPrecedenceOverFilePayloadAndDefault() { + DefaultFileNameGenerator generator = new DefaultFileNameGenerator(); + generator.setHeaderName("foo"); + File payload = new File("/some/path/ignore1"); + Message message = MessageBuilder.withPayload(payload) + .setHeader(FileHeaders.FILENAME, "ignore2") + .setHeader("foo", "bar").build(); + String filename = generator.generateFileName(message); + assertEquals("bar", filename); + } + +}