diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/MultiResourceItemWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/MultiResourceItemWriter.java index b2b9053b2..f752f6791 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/MultiResourceItemWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/MultiResourceItemWriter.java @@ -17,7 +17,8 @@ import org.springframework.util.ClassUtils; /** * Wraps a {@link ResourceAwareItemWriterItemStream} and creates a new output * resource when the count of items written in current resource exceeds - * {@link #setItemCountLimitPerResource(int)}. + * {@link #setItemCountLimitPerResource(int)}. Suffix creation can be customized + * with {@link #setResourceSuffixCreator(ResourceSuffixCreator)}. * * Note that new resources are created only at chunk boundaries i.e. the number * of items written into one resource is between the limit set by @@ -25,8 +26,6 @@ import org.springframework.util.ClassUtils; * * @param item type * - * TODO strategise naming of the created resources - * * @author Robert Kasanicky */ public class MultiResourceItemWriter extends ExecutionContextUserSupport implements ItemWriter, ItemStream { @@ -45,6 +44,8 @@ public class MultiResourceItemWriter extends ExecutionContextUserSupport impl private int resourceIndex = 1; + private ResourceSuffixCreator suffixCreator = new SimpleResourceSuffixCreator(); + public MultiResourceItemWriter() { setName(ClassUtils.getShortName(MultiResourceItemWriter.class)); } @@ -61,14 +62,34 @@ public class MultiResourceItemWriter extends ExecutionContextUserSupport impl currentResourceItemCount += items.size(); } + /** + * Allows customization of the suffix of the created resources based on the + * index. + */ + public void setResourceSuffixCreator(ResourceSuffixCreator suffixCreator) { + this.suffixCreator = suffixCreator; + } + + /** + * After this limit is exceeded the next chunk will be written into newly + * created resource. + */ public void setItemCountLimitPerResource(int itemCountLimitPerResource) { this.itemCountLimitPerResource = itemCountLimitPerResource; } + /** + * Delegate used for actual writing of the output. + */ public void setDelegate(ResourceAwareItemWriterItemStream delegate) { this.delegate = delegate; } + /** + * Prototype for output resources. Actual output files will be created in + * the same directory and use the same name as this prototype with appended + * suffix (according to {@link #setResourceSuffixCreator(ResourceSuffixCreator)}. + */ public void setResource(Resource resource) { this.resource = resource; } @@ -81,8 +102,8 @@ public class MultiResourceItemWriter extends ExecutionContextUserSupport impl public void open(ExecutionContext executionContext) throws ItemStreamException { resourceIndex = Long.valueOf(executionContext.getLong(getKey(RESOURCE_INDEX_KEY), 1L)).intValue(); - currentResourceItemCount = Long.valueOf( - executionContext.getLong(getKey(CURRENT_RESOURCE_ITEM_COUNT), 0L)).intValue(); + currentResourceItemCount = Long.valueOf(executionContext.getLong(getKey(CURRENT_RESOURCE_ITEM_COUNT), 0L)) + .intValue(); try { pointDelegateToNextResource(); } @@ -102,7 +123,7 @@ public class MultiResourceItemWriter extends ExecutionContextUserSupport impl * Create next output resource and point the delegate to it. */ private void pointDelegateToNextResource() throws IOException { - String path = resource.getFile().getAbsolutePath() + "." + resourceIndex; + String path = resource.getFile().getAbsolutePath() + suffixCreator.getSuffix(resourceIndex); File file = new File(path); file.createNewFile(); Assert.state(file.canWrite(), "Output resource " + path + " must be writable"); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/ResourceSuffixCreator.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/ResourceSuffixCreator.java new file mode 100644 index 000000000..bdfa806f1 --- /dev/null +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/ResourceSuffixCreator.java @@ -0,0 +1,15 @@ +package org.springframework.batch.item.file; + +/** + * Strategy interface for translating resource index into unique filename + * suffix. + * + * @see MultiResourceItemWriter + * @see SimpleResourceSuffixCreator + * + * @author Robert Kasanicky + */ +public interface ResourceSuffixCreator { + + String getSuffix(int index); +} diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/SimpleResourceSuffixCreator.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/SimpleResourceSuffixCreator.java new file mode 100644 index 000000000..3b1b36237 --- /dev/null +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/SimpleResourceSuffixCreator.java @@ -0,0 +1,15 @@ +package org.springframework.batch.item.file; + +/** + * Trivial implementation of {@link ResourceSuffixCreator} that uses the index + * itself as suffix, separated by dot. + * + * @author Robert Kasanicky + */ +public class SimpleResourceSuffixCreator implements ResourceSuffixCreator { + + public String getSuffix(int index) { + return "." + index; + } + +} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterTests.java index 3f15476dc..5ad5f89b2 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterTests.java @@ -21,6 +21,8 @@ public class MultiResourceItemWriterTests { private MultiResourceItemWriter tested = new MultiResourceItemWriter(); private File file; + + private ResourceSuffixCreator suffixCreator = new SimpleResourceSuffixCreator(); private ResourceAwareItemWriterItemStream delegate = new FlatFileItemWriter() { { @@ -35,6 +37,7 @@ public class MultiResourceItemWriterTests { file = File.createTempFile(MultiResourceItemWriterTests.class.getSimpleName(), null); tested.setResource(new FileSystemResource(file)); tested.setDelegate(delegate); + tested.setResourceSuffixCreator(suffixCreator); tested.setItemCountLimitPerResource(2); tested.open(executionContext); @@ -45,12 +48,12 @@ public class MultiResourceItemWriterTests { tested.write(Arrays.asList("1", "2", "3")); - File part1 = new File(file.getAbsolutePath() + ".1"); + File part1 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(1)); assertTrue(part1.exists()); assertEquals("123", readFile(part1)); tested.write(Arrays.asList("4")); - File part2 = new File(file.getAbsolutePath() + ".2"); + File part2 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(2)); assertTrue(part2.exists()); assertEquals("4", readFile(part2)); @@ -58,7 +61,7 @@ public class MultiResourceItemWriterTests { assertEquals("45", readFile(part2)); tested.write(Arrays.asList("6", "7", "8", "9")); - File part3 = new File(file.getAbsolutePath() + ".3"); + File part3 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(3)); assertTrue(part3.exists()); assertEquals("6789", readFile(part3)); } @@ -67,12 +70,12 @@ public class MultiResourceItemWriterTests { public void testRestart() throws Exception { tested.write(Arrays.asList("1", "2", "3")); - File part1 = new File(file.getAbsolutePath() + ".1"); + File part1 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(1)); assertTrue(part1.exists()); assertEquals("123", readFile(part1)); tested.write(Arrays.asList("4")); - File part2 = new File(file.getAbsolutePath() + ".2"); + File part2 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(2)); assertTrue(part2.exists()); assertEquals("4", readFile(part2)); @@ -84,7 +87,7 @@ public class MultiResourceItemWriterTests { assertEquals("45", readFile(part2)); tested.write(Arrays.asList("6", "7", "8", "9")); - File part3 = new File(file.getAbsolutePath() + ".3"); + File part3 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(3)); assertTrue(part3.exists()); assertEquals("6789", readFile(part3)); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/SimpleResourceSuffixCreatorTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/SimpleResourceSuffixCreatorTests.java new file mode 100644 index 000000000..c28cac615 --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/SimpleResourceSuffixCreatorTests.java @@ -0,0 +1,20 @@ +package org.springframework.batch.item.file; + +import static org.junit.Assert.*; + +import org.junit.Test; + +/** + * Tests for {@link SimpleResourceSuffixCreator}. + */ +public class SimpleResourceSuffixCreatorTests { + + private SimpleResourceSuffixCreator tested = new SimpleResourceSuffixCreator(); + + @Test + public void testGetSuffix() { + assertEquals("0", tested.getSuffix(0)); + assertEquals("1", tested.getSuffix(1)); + assertEquals("3463457", tested.getSuffix(3463457)); + } +}