/* * Copyright 2008-2014 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.batch.item.file; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.springframework.batch.item.file.transform.PassThroughLineAggregator; import org.springframework.batch.support.transaction.ResourcelessTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; /** * Tests for {@link MultiResourceItemWriter} delegating to * {@link FlatFileItemWriter}. */ public class MultiResourceItemWriterFlatFileTests extends AbstractMultiResourceItemWriterTests { /** * @author dsyer * */ private final class WriterCallback implements TransactionCallback<Void> { private List<? extends String> list; public WriterCallback(List<? extends String> list) { super(); this.list = list; } @Override public Void doInTransaction(TransactionStatus status) { try { tested.write(list); } catch (Exception e) { throw new IllegalStateException("Unexpected"); } return null; } } private FlatFileItemWriter<String> delegate; @Before public void setUp() throws Exception { delegate = new FlatFileItemWriter<String>(); delegate.setLineAggregator(new PassThroughLineAggregator<String>()); } @Test public void testBasicMultiResourceWriteScenario() throws Exception { super.setUp(delegate); tested.write(Arrays.asList("1", "2", "3")); 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() + suffixCreator.getSuffix(2)); assertTrue(part2.exists()); assertEquals("4", readFile(part2)); tested.write(Arrays.asList("5")); assertEquals("45", readFile(part2)); tested.write(Arrays.asList("6", "7", "8", "9")); File part3 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(3)); assertTrue(part3.exists()); assertEquals("6789", readFile(part3)); } @Test public void testUpdateAfterDelegateClose() throws Exception { super.setUp(delegate); tested.update(executionContext); assertEquals(0, executionContext.getInt(tested.getExecutionContextKey("resource.item.count"))); assertEquals(1, executionContext.getInt(tested.getExecutionContextKey("resource.index"))); tested.write(Arrays.asList("1", "2", "3")); tested.update(executionContext); assertEquals(0, executionContext.getInt(tested.getExecutionContextKey("resource.item.count"))); assertEquals(2, executionContext.getInt(tested.getExecutionContextKey("resource.index"))); } @Test public void testMultiResourceWriteScenarioWithFooter() throws Exception { delegate.setFooterCallback(new FlatFileFooterCallback() { @Override public void writeFooter(Writer writer) throws IOException { writer.write("f"); } }); super.setUp(delegate); tested.write(Arrays.asList("1", "2", "3")); File part1 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(1)); assertTrue(part1.exists()); tested.write(Arrays.asList("4")); File part2 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(2)); assertTrue(part2.exists()); tested.close(); assertEquals("123f", readFile(part1)); assertEquals("4f", readFile(part2)); } @Test public void testTransactionalMultiResourceWriteScenarioWithFooter() throws Exception { delegate.setFooterCallback(new FlatFileFooterCallback() { @Override public void writeFooter(Writer writer) throws IOException { writer.write("f"); } }); super.setUp(delegate); ResourcelessTransactionManager transactionManager = new ResourcelessTransactionManager(); new TransactionTemplate(transactionManager).execute(new WriterCallback(Arrays.asList("1", "2", "3"))); File part1 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(1)); assertTrue(part1.exists()); new TransactionTemplate(transactionManager).execute(new WriterCallback(Arrays.asList("4"))); File part2 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(2)); assertTrue(part2.exists()); tested.close(); assertEquals("123f", readFile(part1)); assertEquals("4f", readFile(part2)); } @Test public void testRestart() throws Exception { super.setUp(delegate); tested.write(Arrays.asList("1", "2", "3")); 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() + suffixCreator.getSuffix(2)); assertTrue(part2.exists()); assertEquals("4", readFile(part2)); tested.update(executionContext); tested.close(); tested.open(executionContext); tested.write(Arrays.asList("5")); assertEquals("45", readFile(part2)); tested.write(Arrays.asList("6", "7", "8", "9")); File part3 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(3)); assertTrue(part3.exists()); assertEquals("6789", readFile(part3)); } @Test public void testRestartWithFooter() throws Exception { delegate.setFooterCallback(new FlatFileFooterCallback() { @Override public void writeFooter(Writer writer) throws IOException { writer.write("f"); } }); super.setUp(delegate); tested.write(Arrays.asList("1", "2", "3")); File part1 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(1)); assertTrue(part1.exists()); assertEquals("123f", readFile(part1)); tested.write(Arrays.asList("4")); File part2 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(2)); assertTrue(part2.exists()); assertEquals("4", readFile(part2)); tested.update(executionContext); tested.close(); tested.open(executionContext); tested.write(Arrays.asList("5")); assertEquals("45f", readFile(part2)); tested.write(Arrays.asList("6", "7", "8", "9")); File part3 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(3)); assertTrue(part3.exists()); assertEquals("6789f", readFile(part3)); } @Test public void testTransactionalRestartWithFooter() throws Exception { delegate.setFooterCallback(new FlatFileFooterCallback() { @Override public void writeFooter(Writer writer) throws IOException { writer.write("f"); } }); super.setUp(delegate); ResourcelessTransactionManager transactionManager = new ResourcelessTransactionManager(); new TransactionTemplate(transactionManager).execute(new WriterCallback(Arrays.asList("1", "2", "3"))); File part1 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(1)); assertTrue(part1.exists()); assertEquals("123f", readFile(part1)); new TransactionTemplate(transactionManager).execute(new WriterCallback(Arrays.asList("4"))); File part2 = new File(file.getAbsolutePath() + suffixCreator.getSuffix(2)); assertTrue(part2.exists()); assertEquals("4", readFile(part2)); tested.update(executionContext); tested.close(); tested.open(executionContext); new TransactionTemplate(transactionManager).execute(new WriterCallback(Arrays.asList("5"))); assertEquals("45f", readFile(part2)); } }