diff --git a/spring-batch-execution/src/main/java/org/springframework/batch/execution/configuration/JobBeanDefinitionParser.java b/spring-batch-execution/src/main/java/org/springframework/batch/execution/configuration/JobBeanDefinitionParser.java index c4d42229e..c3bd73622 100644 --- a/spring-batch-execution/src/main/java/org/springframework/batch/execution/configuration/JobBeanDefinitionParser.java +++ b/spring-batch-execution/src/main/java/org/springframework/batch/execution/configuration/JobBeanDefinitionParser.java @@ -7,11 +7,11 @@ import org.w3c.dom.Element; class JobBeanDefinitionParser implements BeanDefinitionParser { - private static final String JOB = "job"; + public static final String JOB = "job"; - private static final String CHUNKING_STEP = "chunking-step"; + public static final String CHUNKING_STEP = "chunking-step"; - private static final String TASKLET_STEP ="tasklet-step"; + public static final String TASKLET_STEP ="tasklet-step"; public BeanDefinition parse(Element element, ParserContext parserContext) { // TODO Auto-generated method stub diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/DelimitedLineAggregator.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/DelimitedLineAggregator.java index 749e134c9..ba1ee6ae6 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/DelimitedLineAggregator.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/DelimitedLineAggregator.java @@ -16,6 +16,8 @@ package org.springframework.batch.io.file.transform; +import org.springframework.batch.io.file.mapping.FieldSet; + /** * Class used to create string representing object. Values are separated by @@ -30,13 +32,13 @@ public class DelimitedLineAggregator implements LineAggregator { /** * Method used to create string representing object. * - * @param args arrays of strings representing data to be stored + * @param fieldSet arrays of strings representing data to be stored * @param lineDescriptor for this implementation this parameter is not * used */ - public String aggregate(String[] args) { + public String aggregate(FieldSet fieldSet) { StringBuffer buffer = new StringBuffer(); - + String[] args = fieldSet.getValues(); for (int i = 0; i < args.length; i++) { buffer.append(args[i]); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/FixedLengthLineAggregator.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/FixedLengthLineAggregator.java index 372c9ca16..5a9aa38c4 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/FixedLengthLineAggregator.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/FixedLengthLineAggregator.java @@ -18,6 +18,7 @@ package org.springframework.batch.io.file.transform; import java.util.Arrays; +import org.springframework.batch.io.file.mapping.FieldSet; import org.springframework.util.Assert; /** @@ -60,14 +61,16 @@ public class FixedLengthLineAggregator implements LineAggregator { * Aggregate provided strings into single line using specified column * ranges. * - * @param args + * @param fieldSet * arrays of strings representing data to be aggregated * @return aggregated strings */ - public String aggregate(String[] args) { + public String aggregate(FieldSet fieldSet) { - Assert.notNull(args); + Assert.notNull(fieldSet); Assert.notNull(ranges); + + String[] args = fieldSet.getValues(); Assert.isTrue(args.length <= ranges.length, "Number of arguments must match number of fields in a record"); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/LineAggregator.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/LineAggregator.java index a3511809d..718e0dc5a 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/LineAggregator.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/LineAggregator.java @@ -16,6 +16,8 @@ package org.springframework.batch.io.file.transform; +import org.springframework.batch.io.file.mapping.FieldSet; + /** * Interface used to create string used to create string representing object. @@ -26,9 +28,8 @@ public interface LineAggregator { /** * Method used to create a string to be stored from the array of values. * - * @param args values to be stored - * @param lineDescriptor structure of final string + * @param fieldSet values to be converted * @return */ - public String aggregate(String[] args); + public String aggregate(FieldSet fieldSet); } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/LineAggregatorItemTransformer.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/LineAggregatorItemTransformer.java index a9566d9af..8886f64ce 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/LineAggregatorItemTransformer.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/transform/LineAggregatorItemTransformer.java @@ -15,6 +15,8 @@ */ package org.springframework.batch.io.file.transform; +import org.springframework.batch.io.file.mapping.DefaultFieldSet; +import org.springframework.batch.io.file.mapping.FieldSet; import org.springframework.batch.item.writer.ItemTransformer; /** @@ -43,6 +45,14 @@ public class LineAggregatorItemTransformer implements ItemTransformer { * @see org.springframework.batch.item.writer.ItemTransformer#transform(java.lang.Object) */ public Object transform(Object item) throws Exception { - return aggregator.aggregate((String[]) item); + return aggregator.aggregate(createFieldSet(item)); + } + + /** + * @param item + * @return + */ + protected FieldSet createFieldSet(Object item) { + return new DefaultFieldSet((String[]) item); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/DelimitedLineAggregatorTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/DelimitedLineAggregatorTests.java index 9b4a159da..debd4fcb2 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/DelimitedLineAggregatorTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/DelimitedLineAggregatorTests.java @@ -16,10 +16,10 @@ package org.springframework.batch.io.file.transform; -import org.springframework.batch.io.file.transform.DelimitedLineAggregator; - import junit.framework.TestCase; +import org.springframework.batch.io.file.mapping.DefaultFieldSet; + /** * Unit tests for {@link DelimitedLineAggregator} * @@ -34,7 +34,7 @@ public class DelimitedLineAggregatorTests extends TestCase { String[] args = { "a", "bc", "def" }; String expectedResult = "a:bc:def"; - String result = aggregator.aggregate(args); + String result = aggregator.aggregate(new DefaultFieldSet(args)); assertEquals(result, expectedResult); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/FixedLengthLineAggregatorTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/FixedLengthLineAggregatorTests.java index b92917939..3a95a2c34 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/FixedLengthLineAggregatorTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/FixedLengthLineAggregatorTests.java @@ -16,6 +16,7 @@ package org.springframework.batch.io.file.transform; +import org.springframework.batch.io.file.mapping.DefaultFieldSet; import org.springframework.batch.io.file.transform.FixedLengthLineAggregator; import org.springframework.batch.io.file.transform.Range; @@ -39,7 +40,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { String[] args = { "does not matter what is here" }; try { - aggregator.aggregate(args); + aggregator.aggregate(new DefaultFieldSet(args)); fail("should not work with no ranges specified"); } catch (IllegalArgumentException expected) { @@ -55,7 +56,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { aggregator.setColumns(new Range[0]); try { - aggregator.aggregate(string); + aggregator.aggregate(new DefaultFieldSet(string)); fail("Exception expected: count of aggregated strings" + " does not match the number of columns"); } @@ -71,7 +72,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { String[] args = { "Oversize" }; aggregator.setColumns(new Range[] {new Range(1,args[0].length()-1)}); try { - aggregator.aggregate(args); + aggregator.aggregate(new DefaultFieldSet(args)); fail("Invalid text length, exception should have been thrown"); } catch (IllegalArgumentException expected) { @@ -85,7 +86,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { public void testAggregate() { String[] args = { "Matchsize", "Smallsize" }; aggregator.setColumns(new Range[] {new Range(1,9), new Range(10,18)}); - String result = aggregator.aggregate(args); + String result = aggregator.aggregate(new DefaultFieldSet(args)); assertEquals("MatchsizeSmallsize", result); } @@ -95,7 +96,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { public void testAggregateWithLastRangeUnbound() { String[] args = { "Matchsize", "Smallsize" }; aggregator.setColumns(new Range[] {new Range(1,12), new Range(13)}); - String result = aggregator.aggregate(args); + String result = aggregator.aggregate(new DefaultFieldSet(args)); assertEquals("Matchsize Smallsize", result); } @@ -107,7 +108,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { String[] args = { "Matchsize", "Smallsize" }; aggregator.setAlignment("right"); aggregator.setColumns(new Range[] {new Range(1,13), new Range(14,23)}); - String result = aggregator.aggregate(args); + String result = aggregator.aggregate(new DefaultFieldSet(args)); assertEquals(23,result.length()); assertEquals(result, " Matchsize Smallsize"); } @@ -119,7 +120,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { String[] args = { "Matchsize", "Smallsize" }; aggregator.setAlignment("center"); aggregator.setColumns(new Range[] {new Range(1,13), new Range(14,25)}); - String result = aggregator.aggregate(args); + String result = aggregator.aggregate(new DefaultFieldSet(args)); assertEquals(result, " Matchsize Smallsize "); } @@ -131,7 +132,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { aggregator.setPadding('.'); aggregator.setAlignment("left"); aggregator.setColumns(new Range[] {new Range(1,13), new Range(14,24)}); - String result = aggregator.aggregate(args); + String result = aggregator.aggregate(new DefaultFieldSet(args)); assertEquals(result, "Matchsize....Smallsize.."); } @@ -142,7 +143,7 @@ public class FixedLengthLineAggregatorTests extends TestCase { String[] args = { "Matchsize", "Smallsize" }; aggregator.setAlignment("left"); aggregator.setColumns(new Range[] {new Range(1,13), new Range(14,24)}); - String result = aggregator.aggregate(args); + String result = aggregator.aggregate(new DefaultFieldSet(args)); assertEquals(result, "Matchsize Smallsize "); } @@ -166,6 +167,6 @@ public class FixedLengthLineAggregatorTests extends TestCase { public void testAggregateNullArgument() { String[] args = { null }; aggregator.setColumns(new Range[] {new Range(1,3)}); - assertEquals(" ", aggregator.aggregate(args)); + assertEquals(" ", aggregator.aggregate(new DefaultFieldSet(args))); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/LineAggregatorItemTransformerTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/LineAggregatorItemTransformerTests.java index be4bc3625..c8e5267fc 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/LineAggregatorItemTransformerTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/LineAggregatorItemTransformerTests.java @@ -15,6 +15,8 @@ */ package org.springframework.batch.io.file.transform; +import org.springframework.batch.io.file.mapping.FieldSet; + import junit.framework.TestCase; /** @@ -31,7 +33,7 @@ public class LineAggregatorItemTransformerTests extends TestCase { */ public void testSetAggregator() throws Exception { transformer.setAggregator(new LineAggregator() { - public String aggregate(String[] args) { + public String aggregate(FieldSet fieldSet) { return "foo"; } }); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/LineAggregatorStub.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/StubLineAggregator.java similarity index 74% rename from spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/LineAggregatorStub.java rename to spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/StubLineAggregator.java index d4a46dfbb..28a0cbe7f 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/LineAggregatorStub.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/transform/StubLineAggregator.java @@ -16,7 +16,7 @@ package org.springframework.batch.io.file.transform; -import org.springframework.batch.io.file.transform.LineAggregator; +import org.springframework.batch.io.file.mapping.FieldSet; /** @@ -24,16 +24,16 @@ import org.springframework.batch.io.file.transform.LineAggregator; * * @author robert.kasanicky */ -public class LineAggregatorStub implements LineAggregator { +public class StubLineAggregator implements LineAggregator { /** - * Concatenates arguments. Ignores the LineDescriptor. + * Concatenates arguments. */ - public String aggregate(String[] args) { + public String aggregate(FieldSet fieldSet) { String result = ""; - for (int i = 1; i < args.length; i++) { - result = result + args[i]; + for (int i = 1; i < fieldSet.getFieldCount(); i++) { + result = result + fieldSet.readString(i); } return result; diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/dao/OrderTransformer.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/dao/OrderTransformer.java index 4c4046aa6..9a05a0a31 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/dao/OrderTransformer.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/dao/OrderTransformer.java @@ -21,6 +21,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import org.springframework.batch.io.file.mapping.DefaultFieldSet; +import org.springframework.batch.io.file.mapping.FieldSet; import org.springframework.batch.io.file.transform.LineAggregator; import org.springframework.batch.item.writer.ItemTransformer; import org.springframework.batch.sample.domain.Address; @@ -29,89 +31,94 @@ import org.springframework.batch.sample.domain.Customer; import org.springframework.batch.sample.domain.LineItem; import org.springframework.batch.sample.domain.Order; - /** * Converts Order object to a String. * @author Dave Syer */ public class OrderTransformer implements ItemTransformer { - /** - * Aggregators for all types of lines in the output file - */ - private Map aggregators; + /** + * Aggregators for all types of lines in the output file + */ + private Map aggregators; - /** - * Converts information from an Order object to a collection of Strings for output. - */ - public Object transform(Object data) { - Order order = (Order) data; - - List result = new ArrayList(); + /** + * Converts information from an Order object to a collection of Strings for + * output. + */ + public Object transform(Object data) { + Order order = (Order) data; - result.add(getAggregator("header").aggregate(OrderFormatterUtils.headerArgs(order))); - result.add(getAggregator("customer").aggregate(OrderFormatterUtils.customerArgs(order))); - result.add(getAggregator("address").aggregate(OrderFormatterUtils.billingAddressArgs(order))); - result.add(getAggregator("billing").aggregate(OrderFormatterUtils.billingInfoArgs(order))); + List result = new ArrayList(); - List items = order.getLineItems(); - LineItem item; + result.add(getAggregator("header").aggregate(OrderFormatterUtils.headerArgs(order))); + result.add(getAggregator("customer").aggregate(OrderFormatterUtils.customerArgs(order))); + result.add(getAggregator("address").aggregate(OrderFormatterUtils.billingAddressArgs(order))); + result.add(getAggregator("billing").aggregate(OrderFormatterUtils.billingInfoArgs(order))); - for (int i = 0; i < items.size(); i++) { - item = (LineItem) items.get(i); - result.add(getAggregator("item").aggregate(OrderFormatterUtils.lineItemArgs(item))); - } + List items = order.getLineItems(); + LineItem item; - result.add(getAggregator("footer").aggregate(OrderFormatterUtils.footerArgs(order))); - - return result; - } - - public void setAggregators(Map aggregators) { - this.aggregators = aggregators; - } - - private LineAggregator getAggregator(String name) { + for (int i = 0; i < items.size(); i++) { + item = (LineItem) items.get(i); + result.add(getAggregator("item").aggregate(OrderFormatterUtils.lineItemArgs(item))); + } + + result.add(getAggregator("footer").aggregate(OrderFormatterUtils.footerArgs(order))); + + return result; + } + + public void setAggregators(Map aggregators) { + this.aggregators = aggregators; + } + + private LineAggregator getAggregator(String name) { return (LineAggregator) aggregators.get(name); } - /** - * Utility class encapsulating formatting of Order and its nested objects. - */ + /** + * Utility class encapsulating formatting of Order and its + * nested objects. + */ private static class OrderFormatterUtils { - + private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); - static String[] headerArgs(Order order) { - return new String[] { "BEGIN_ORDER:", String.valueOf(order.getOrderId()), dateFormat.format(order.getOrderDate()) }; + static FieldSet headerArgs(Order order) { + return new DefaultFieldSet(new String[] { "BEGIN_ORDER:", String.valueOf(order.getOrderId()), + dateFormat.format(order.getOrderDate()) }); } - static String[] footerArgs(Order order) { - return new String[] { "END_ORDER:", order.getTotalPrice().toString() }; + static FieldSet footerArgs(Order order) { + return new DefaultFieldSet(new String[] { "END_ORDER:", order.getTotalPrice().toString() }); } - static String[] customerArgs(Order order) { + static FieldSet customerArgs(Order order) { Customer customer = order.getCustomer(); - return new String[] { "CUSTOMER:", String.valueOf(customer.getRegistrationId()), customer.getFirstName(), - customer.getMiddleName(), customer.getLastName() }; + return new DefaultFieldSet(new String[] { "CUSTOMER:", String.valueOf(customer.getRegistrationId()), + customer.getFirstName(), customer.getMiddleName(), customer.getLastName() }); } - static String[] lineItemArgs(LineItem item) { - return new String[] { "ITEM:", String.valueOf(item.getItemId()), item.getPrice().toString() }; + static FieldSet lineItemArgs(LineItem item) { + return new DefaultFieldSet(new String[] { "ITEM:", String.valueOf(item.getItemId()), + item.getPrice().toString() }); } - static String[] billingAddressArgs(Order order) { + static FieldSet billingAddressArgs(Order order) { Address address = order.getBillingAddress(); - return new String[] { "ADDRESS:", address.getAddrLine1(), address.getCity(), address.getZipCode() }; + return new DefaultFieldSet(new String[] { "ADDRESS:", address.getAddrLine1(), address.getCity(), + address.getZipCode() }); } - static String[] billingInfoArgs(Order order) { + static FieldSet billingInfoArgs(Order order) { BillingInfo billingInfo = order.getBilling(); - return new String[] { "BILLING:", billingInfo.getPaymentId(), billingInfo.getPaymentDesc() }; + return new DefaultFieldSet(new String[] { "BILLING:", billingInfo.getPaymentId(), + billingInfo.getPaymentDesc() }); } } - + } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/LineAggregatorStub.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/StubLineAggregator.java similarity index 78% rename from spring-batch-samples/src/test/java/org/springframework/batch/sample/LineAggregatorStub.java rename to spring-batch-samples/src/test/java/org/springframework/batch/sample/StubLineAggregator.java index e5b423fa7..c6a1f7fc2 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/LineAggregatorStub.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/StubLineAggregator.java @@ -16,6 +16,7 @@ package org.springframework.batch.sample; +import org.springframework.batch.io.file.mapping.FieldSet; import org.springframework.batch.io.file.transform.LineAggregator; @@ -24,16 +25,16 @@ import org.springframework.batch.io.file.transform.LineAggregator; * * @author robert.kasanicky */ -public class LineAggregatorStub implements LineAggregator { +public class StubLineAggregator implements LineAggregator { /** * Concatenates arguments. Ignores the LineDescriptor. */ - public String aggregate(String[] args) { + public String aggregate(FieldSet fieldSet) { String result = ""; - for (int i = 1; i < args.length; i++) { - result = result + args[i]; + for (int i = 1; i < fieldSet.getFieldCount(); i++) { + result = result + fieldSet.readString(i); } return result; diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/dao/FlatFileOrderWriterTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/dao/FlatFileOrderWriterTests.java index 116be674e..c78f3cb25 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/dao/FlatFileOrderWriterTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/dao/FlatFileOrderWriterTests.java @@ -12,7 +12,7 @@ import junit.framework.TestCase; import org.springframework.batch.io.file.transform.LineAggregator; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.writer.AbstractItemWriter; -import org.springframework.batch.sample.LineAggregatorStub; +import org.springframework.batch.sample.StubLineAggregator; import org.springframework.batch.sample.domain.Address; import org.springframework.batch.sample.domain.BillingInfo; import org.springframework.batch.sample.domain.Customer; @@ -56,7 +56,7 @@ public class FlatFileOrderWriterTests extends TestCase { order.setTotalPrice(BigDecimal.valueOf(0)); //create aggregator stub - LineAggregator aggregator = new LineAggregatorStub(); + LineAggregator aggregator = new StubLineAggregator(); //create map of aggregators and set it to writer Map aggregators = new HashMap();