OPEN - issue BATCH-371: FlatFileItemWriter no longer uses LineAggregator

http://jira.springframework.org/browse/BATCH-371

Changed the interface of LineAggregator for symmetry with LineTokenizer.
This commit is contained in:
dsyer
2008-02-20 08:55:35 +00:00
parent 2d9a4fb570
commit f6bd90fc3e
12 changed files with 116 additions and 89 deletions

View File

@@ -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 <code>Order</code> 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 <code>Order</code> and its nested objects.
*/
/**
* Utility class encapsulating formatting of <code>Order</code> 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() });
}
}
}

View File

@@ -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;

View File

@@ -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();