BATCH-1247: Clean up multilineOrderJob sample

This commit is contained in:
dhgarrette
2009-05-22 06:13:28 +00:00
parent bd57241b6a
commit bf2d9af030
30 changed files with 486 additions and 609 deletions

View File

@@ -52,7 +52,7 @@ public class OrderItemReader implements ItemReader<Order> {
private FieldSetMapper<LineItem> itemMapper;
private FieldSetMapper<ShippingInfo> shippingMapper;
private ItemReader<FieldSet> fieldSetReader;
/**
@@ -67,7 +67,7 @@ public class OrderItemReader implements ItemReader<Order> {
}
log.info("Mapped: " + order);
Order result = order;
order = null;
@@ -80,7 +80,6 @@ public class OrderItemReader implements ItemReader<Order> {
log.debug("FINISHED");
recordFinished = true;
order = null;
return;
}
@@ -90,12 +89,8 @@ public class OrderItemReader implements ItemReader<Order> {
if (Order.LINE_ID_HEADER.equals(lineId)) {
log.debug("STARTING NEW RECORD");
order = headerMapper.mapFieldSet(fieldSet);
return;
}
// mark we are finished with current Order
if (Order.LINE_ID_FOOTER.equals(lineId)) {
else if (Order.LINE_ID_FOOTER.equals(lineId)) {
log.debug("END OF RECORD");
// Do mapping for footer here, because mapper does not allow to pass
@@ -105,74 +100,57 @@ public class OrderItemReader implements ItemReader<Order> {
order.setTotalLines(fieldSet.readInt("TOTAL_LINE_ITEMS"));
order.setTotalItems(fieldSet.readInt("TOTAL_ITEMS"));
// mark we are finished with current Order
recordFinished = true;
return;
}
if (Customer.LINE_ID_BUSINESS_CUST.equals(lineId)) {
else if (Customer.LINE_ID_BUSINESS_CUST.equals(lineId)) {
log.debug("MAPPING CUSTOMER");
if (order.getCustomer() == null) {
order.setCustomer(customerMapper.mapFieldSet(fieldSet));
order.getCustomer().setBusinessCustomer(true);
Customer customer = customerMapper.mapFieldSet(fieldSet);
customer.setBusinessCustomer(true);
order.setCustomer(customer);
}
return;
}
if (Customer.LINE_ID_NON_BUSINESS_CUST.equals(lineId)) {
else if (Customer.LINE_ID_NON_BUSINESS_CUST.equals(lineId)) {
log.debug("MAPPING CUSTOMER");
if (order.getCustomer() == null) {
order.setCustomer(customerMapper.mapFieldSet(fieldSet));
order.getCustomer().setBusinessCustomer(false);
Customer customer = customerMapper.mapFieldSet(fieldSet);
customer.setBusinessCustomer(false);
order.setCustomer(customer);
}
return;
}
if (Address.LINE_ID_BILLING_ADDR.equals(lineId)) {
else if (Address.LINE_ID_BILLING_ADDR.equals(lineId)) {
log.debug("MAPPING BILLING ADDRESS");
order.setBillingAddress(addressMapper.mapFieldSet(fieldSet));
return;
}
if (Address.LINE_ID_SHIPPING_ADDR.equals(lineId)) {
else if (Address.LINE_ID_SHIPPING_ADDR.equals(lineId)) {
log.debug("MAPPING SHIPPING ADDRESS");
order.setShippingAddress(addressMapper.mapFieldSet(fieldSet));
return;
}
if (BillingInfo.LINE_ID_BILLING_INFO.equals(lineId)) {
else if (BillingInfo.LINE_ID_BILLING_INFO.equals(lineId)) {
log.debug("MAPPING BILLING INFO");
order.setBilling(billingMapper.mapFieldSet(fieldSet));
return;
}
if (ShippingInfo.LINE_ID_SHIPPING_INFO.equals(lineId)) {
else if (ShippingInfo.LINE_ID_SHIPPING_INFO.equals(lineId)) {
log.debug("MAPPING SHIPPING INFO");
order.setShipping(shippingMapper.mapFieldSet(fieldSet));
return;
}
if (LineItem.LINE_ID_ITEM.equals(lineId)) {
else if (LineItem.LINE_ID_ITEM.equals(lineId)) {
log.debug("MAPPING LINE ITEM");
if (order.getLineItems() == null) {
order.setLineItems(new ArrayList<LineItem>());
}
order.getLineItems().add(itemMapper.mapFieldSet(fieldSet));
return;
}
else {
log.debug("Could not map LINE_ID=" + lineId);
}
log.debug("Could not map LINE_ID=" + lineId);
}
/**
* @param fieldSetReader reads lines from the file converting them to {@link FieldSet}.
* @param fieldSetReader reads lines from the file converting them to
* {@link FieldSet}.
*/
public void setFieldSetReader(ItemReader<FieldSet> fieldSetReader) {
this.fieldSetReader = fieldSetReader;

View File

@@ -16,16 +16,12 @@
package org.springframework.batch.sample.domain.order.internal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.file.transform.LineAggregator;
import org.springframework.batch.sample.domain.order.Address;
import org.springframework.batch.sample.domain.order.BillingInfo;
import org.springframework.batch.sample.domain.order.Customer;
import org.springframework.batch.sample.domain.order.LineItem;
import org.springframework.batch.sample.domain.order.Order;
@@ -39,80 +35,34 @@ public class OrderProcessor implements ItemProcessor<Order, List<String>> {
/**
* Aggregators for all types of lines in the output file
*/
private Map<String, LineAggregator<Object[]>> aggregators;
private Map<String, LineAggregator<Object>> aggregators;
/**
* Converts information from an Order object to a collection of Strings for
* output.
* @throws Exception
*
* @throws Exception
*/
public List<String> process(Order order) throws Exception {
List<String> result = new ArrayList<String>();
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)));
result.add(aggregators.get("header").aggregate(order));
result.add(aggregators.get("customer").aggregate(order));
result.add(aggregators.get("address").aggregate(order));
result.add(aggregators.get("billing").aggregate(order));
List<LineItem> items = order.getLineItems();
for (LineItem lineItem : items) {
result.add(getAggregator("item").aggregate(OrderFormatterUtils.lineItemArgs(lineItem)));
for (LineItem lineItem : order.getLineItems()) {
result.add(aggregators.get("item").aggregate(lineItem));
}
result.add(getAggregator("footer").aggregate(OrderFormatterUtils.footerArgs(order)));
result.add(aggregators.get("footer").aggregate(order));
return result;
}
public void setAggregators(Map<String, LineAggregator<Object[]>> aggregators) {
public void setAggregators(Map<String, LineAggregator<Object>> aggregators) {
this.aggregators = aggregators;
}
private LineAggregator<Object[]> getAggregator(String name) {
return aggregators.get(name);
}
/**
* 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 Object[] headerArgs(Order order) {
return new Object[] { "BEGIN_ORDER:", String.valueOf(order.getOrderId()),
dateFormat.format(order.getOrderDate()) };
}
static Object[] footerArgs(Order order) {
return new Object[] { "END_ORDER:", order.getTotalPrice().toString() };
}
static Object[] customerArgs(Order order) {
Customer customer = order.getCustomer();
return new Object[] { "CUSTOMER:", String.valueOf(customer.getRegistrationId()), customer.getFirstName(),
customer.getMiddleName(), customer.getLastName() };
}
static Object[] lineItemArgs(LineItem item) {
return new Object[] { "ITEM:", String.valueOf(item.getItemId()), item.getPrice().toString() };
}
static Object[] billingAddressArgs(Order order) {
Address address = order.getBillingAddress();
return new Object[] { "ADDRESS:", address.getAddrLine1(), address.getCity(), address.getZipCode() };
}
static Object[] billingInfoArgs(Order order) {
BillingInfo billingInfo = order.getBilling();
return new Object[] { "BILLING:", billingInfo.getPaymentId(), billingInfo.getPaymentDesc() };
}
}
}

View File

@@ -0,0 +1,18 @@
package org.springframework.batch.sample.domain.order.internal.extractor;
import org.springframework.batch.item.file.transform.FieldExtractor;
import org.springframework.batch.sample.domain.order.Address;
import org.springframework.batch.sample.domain.order.Order;
/**
* @author Dan Garrette
* @since 2.0.1
*/
public class AddressFieldExtractor implements FieldExtractor<Order> {
public Object[] extract(Order order) {
Address address = order.getBillingAddress();
return new Object[] { "ADDRESS:", address.getAddrLine1(), address.getCity(), address.getZipCode() };
}
}

View File

@@ -0,0 +1,18 @@
package org.springframework.batch.sample.domain.order.internal.extractor;
import org.springframework.batch.item.file.transform.FieldExtractor;
import org.springframework.batch.sample.domain.order.BillingInfo;
import org.springframework.batch.sample.domain.order.Order;
/**
* @author Dan Garrette
* @since 2.0.1
*/
public class BillingInfoFieldExtractor implements FieldExtractor<Order> {
public Object[] extract(Order order) {
BillingInfo billingInfo = order.getBilling();
return new Object[] { "BILLING:", billingInfo.getPaymentId(), billingInfo.getPaymentDesc() };
}
}

View File

@@ -0,0 +1,23 @@
package org.springframework.batch.sample.domain.order.internal.extractor;
import org.springframework.batch.item.file.transform.FieldExtractor;
import org.springframework.batch.sample.domain.order.Customer;
import org.springframework.batch.sample.domain.order.Order;
/**
* @author Dan Garrette
* @since 2.0.1
*/
public class CustomerFieldExtractor implements FieldExtractor<Order> {
public Object[] extract(Order order) {
Customer customer = order.getCustomer();
return new Object[] { "CUSTOMER:", customer.getRegistrationId(), emptyIfNull(customer.getFirstName()),
emptyIfNull(customer.getMiddleName()), emptyIfNull(customer.getLastName()) };
}
private String emptyIfNull(String s) {
return s != null ? s : "";
}
}

View File

@@ -0,0 +1,16 @@
package org.springframework.batch.sample.domain.order.internal.extractor;
import org.springframework.batch.item.file.transform.FieldExtractor;
import org.springframework.batch.sample.domain.order.Order;
/**
* @author Dan Garrette
* @since 2.0.1
*/
public class FooterFieldExtractor implements FieldExtractor<Order> {
public Object[] extract(Order order) {
return new Object[] { "END_ORDER:", order.getTotalPrice() };
}
}

View File

@@ -0,0 +1,20 @@
package org.springframework.batch.sample.domain.order.internal.extractor;
import java.text.SimpleDateFormat;
import org.springframework.batch.item.file.transform.FieldExtractor;
import org.springframework.batch.sample.domain.order.Order;
/**
* @author Dan Garrette
* @since 2.0.1
*/
public class HeaderFieldExtractor implements FieldExtractor<Order> {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
public Object[] extract(Order order) {
return new Object[] { "BEGIN_ORDER:", order.getOrderId(), dateFormat.format(order.getOrderDate()) };
}
}

View File

@@ -0,0 +1,16 @@
package org.springframework.batch.sample.domain.order.internal.extractor;
import org.springframework.batch.item.file.transform.FieldExtractor;
import org.springframework.batch.sample.domain.order.LineItem;
/**
* @author Dan Garrette
* @since 2.0.1
*/
public class LineItemFieldExtractor implements FieldExtractor<LineItem> {
public Object[] extract(LineItem item) {
return new Object[] { "ITEM:", item.getItemId(), item.getPrice() };
}
}

View File

@@ -14,16 +14,14 @@
* limitations under the License.
*/
package org.springframework.batch.sample.domain.order.internal;
package org.springframework.batch.sample.domain.order.internal.mapper;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.batch.sample.domain.order.Address;
public class AddressFieldSetMapper implements FieldSetMapper<Address> {
public static final String ADDRESSEE_COLUMN = "ADDRESSEE";
public static final String ADDRESS_LINE1_COLUMN = "ADDR_LINE1";
public static final String ADDRESS_LINE2_COLUMN = "ADDR_LINE2";
@@ -31,19 +29,18 @@ public class AddressFieldSetMapper implements FieldSetMapper<Address> {
public static final String ZIP_CODE_COLUMN = "ZIP_CODE";
public static final String STATE_COLUMN = "STATE";
public static final String COUNTRY_COLUMN = "COUNTRY";
public Address mapFieldSet(FieldSet fieldSet) {
Address address = new Address();
address.setAddressee(fieldSet.readString(ADDRESSEE_COLUMN));
address.setAddrLine1(fieldSet.readString(ADDRESS_LINE1_COLUMN));
address.setAddrLine2(fieldSet.readString(ADDRESS_LINE2_COLUMN));
address.setCity(fieldSet.readString(CITY_COLUMN));
address.setZipCode(fieldSet.readString(ZIP_CODE_COLUMN));
address.setState(fieldSet.readString(STATE_COLUMN));
address.setCountry(fieldSet.readString(COUNTRY_COLUMN));
public Address mapFieldSet(FieldSet fieldSet) {
Address address = new Address();
return address;
}
address.setAddressee(fieldSet.readString(ADDRESSEE_COLUMN));
address.setAddrLine1(fieldSet.readString(ADDRESS_LINE1_COLUMN));
address.setAddrLine2(fieldSet.readString(ADDRESS_LINE2_COLUMN));
address.setCity(fieldSet.readString(CITY_COLUMN));
address.setZipCode(fieldSet.readString(ZIP_CODE_COLUMN));
address.setState(fieldSet.readString(STATE_COLUMN));
address.setCountry(fieldSet.readString(COUNTRY_COLUMN));
return address;
}
}

View File

@@ -14,25 +14,23 @@
* limitations under the License.
*/
package org.springframework.batch.sample.domain.order.internal;
package org.springframework.batch.sample.domain.order.internal.mapper;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.batch.sample.domain.order.BillingInfo;
public class BillingFieldSetMapper implements FieldSetMapper<BillingInfo> {
public static final String PAYMENT_TYPE_ID_COLUMN = "PAYMENT_TYPE_ID";
public static final String PAYMENT_DESC_COLUMN = "PAYMENT_DESC";
public BillingInfo mapFieldSet(FieldSet fieldSet) {
BillingInfo info = new BillingInfo();
info.setPaymentId(fieldSet.readString(PAYMENT_TYPE_ID_COLUMN));
info.setPaymentDesc(fieldSet.readString(PAYMENT_DESC_COLUMN));
public BillingInfo mapFieldSet(FieldSet fieldSet) {
BillingInfo info = new BillingInfo();
return info;
}
info.setPaymentId(fieldSet.readString(PAYMENT_TYPE_ID_COLUMN));
info.setPaymentDesc(fieldSet.readString(PAYMENT_DESC_COLUMN));
return info;
}
}

View File

@@ -14,16 +14,14 @@
* limitations under the License.
*/
package org.springframework.batch.sample.domain.order.internal;
package org.springframework.batch.sample.domain.order.internal.mapper;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.batch.sample.domain.order.Customer;
public class CustomerFieldSetMapper implements FieldSetMapper<Customer> {
public static final String LINE_ID_COLUMN = "LINE_ID";
public static final String COMPANY_NAME_COLUMN = "COMPANY_NAME";
public static final String LAST_NAME_COLUMN = "LAST_NAME";
@@ -33,26 +31,26 @@ public class CustomerFieldSetMapper implements FieldSetMapper<Customer> {
public static final String REGISTERED_COLUMN = "REGISTERED";
public static final String REG_ID_COLUMN = "REG_ID";
public static final String VIP_COLUMN = "VIP";
public Customer mapFieldSet(FieldSet fieldSet) {
Customer customer = new Customer();
if (Customer.LINE_ID_BUSINESS_CUST.equals(fieldSet.readString(LINE_ID_COLUMN))) {
customer.setCompanyName(fieldSet.readString(COMPANY_NAME_COLUMN));
//business customer must be always registered
customer.setRegistered(true);
}
public Customer mapFieldSet(FieldSet fieldSet) {
Customer customer = new Customer();
if (Customer.LINE_ID_NON_BUSINESS_CUST.equals(fieldSet.readString(LINE_ID_COLUMN))) {
customer.setLastName(fieldSet.readString(LAST_NAME_COLUMN));
customer.setFirstName(fieldSet.readString(FIRST_NAME_COLUMN));
customer.setMiddleName(fieldSet.readString(MIDDLE_NAME_COLUMN));
customer.setRegistered(TRUE_SYMBOL.equals(fieldSet.readString(REGISTERED_COLUMN)));
}
if (Customer.LINE_ID_BUSINESS_CUST.equals(fieldSet.readString(LINE_ID_COLUMN))) {
customer.setCompanyName(fieldSet.readString(COMPANY_NAME_COLUMN));
// business customer must be always registered
customer.setRegistered(true);
}
customer.setRegistrationId(fieldSet.readLong(REG_ID_COLUMN));
customer.setVip(TRUE_SYMBOL.equals(fieldSet.readString(VIP_COLUMN)));
if (Customer.LINE_ID_NON_BUSINESS_CUST.equals(fieldSet.readString(LINE_ID_COLUMN))) {
customer.setLastName(fieldSet.readString(LAST_NAME_COLUMN));
customer.setFirstName(fieldSet.readString(FIRST_NAME_COLUMN));
customer.setMiddleName(fieldSet.readString(MIDDLE_NAME_COLUMN));
customer.setRegistered(TRUE_SYMBOL.equals(fieldSet.readString(REGISTERED_COLUMN)));
}
return customer;
}
customer.setRegistrationId(fieldSet.readLong(REG_ID_COLUMN));
customer.setVip(TRUE_SYMBOL.equals(fieldSet.readString(VIP_COLUMN)));
return customer;
}
}

View File

@@ -14,24 +14,22 @@
* limitations under the License.
*/
package org.springframework.batch.sample.domain.order.internal;
package org.springframework.batch.sample.domain.order.internal.mapper;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.batch.sample.domain.order.Order;
public class HeaderFieldSetMapper implements FieldSetMapper<Order> {
public static final String ORDER_ID_COLUMN = "ORDER_ID";
public static final String ORDER_DATE_COLUMN = "ORDER_DATE";
public Order mapFieldSet(FieldSet fieldSet) {
Order order = new Order();
order.setOrderId(fieldSet.readLong(ORDER_ID_COLUMN));
order.setOrderDate(fieldSet.readDate(ORDER_DATE_COLUMN));
return order;
}
public Order mapFieldSet(FieldSet fieldSet) {
Order order = new Order();
order.setOrderId(fieldSet.readLong(ORDER_ID_COLUMN));
order.setOrderDate(fieldSet.readDate(ORDER_DATE_COLUMN));
return order;
}
}

View File

@@ -14,15 +14,14 @@
* limitations under the License.
*/
package org.springframework.batch.sample.domain.order.internal;
package org.springframework.batch.sample.domain.order.internal.mapper;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.batch.sample.domain.order.LineItem;
public class OrderItemFieldSetMapper implements FieldSetMapper<LineItem> {
public static final String TOTAL_PRICE_COLUMN = "TOTAL_PRICE";
public static final String QUANTITY_COLUMN = "QUANTITY";
public static final String HANDLING_PRICE_COLUMN = "HANDLING_PRICE";
@@ -31,20 +30,19 @@ public class OrderItemFieldSetMapper implements FieldSetMapper<LineItem> {
public static final String DISCOUNT_PERC_COLUMN = "DISCOUNT_PERC";
public static final String PRICE_COLUMN = "PRICE";
public static final String ITEM_ID_COLUMN = "ITEM_ID";
public LineItem mapFieldSet(FieldSet fieldSet) {
LineItem item = new LineItem();
item.setItemId(fieldSet.readLong(ITEM_ID_COLUMN));
item.setPrice(fieldSet.readBigDecimal(PRICE_COLUMN));
item.setDiscountPerc(fieldSet.readBigDecimal(DISCOUNT_PERC_COLUMN));
item.setDiscountAmount(fieldSet.readBigDecimal(DISCOUNT_AMOUNT_COLUMN));
item.setShippingPrice(fieldSet.readBigDecimal(SHIPPING_PRICE_COLUMN));
item.setHandlingPrice(fieldSet.readBigDecimal(HANDLING_PRICE_COLUMN));
item.setQuantity(fieldSet.readInt(QUANTITY_COLUMN));
item.setTotalPrice(fieldSet.readBigDecimal(TOTAL_PRICE_COLUMN));
public LineItem mapFieldSet(FieldSet fieldSet) {
LineItem item = new LineItem();
return item;
}
item.setItemId(fieldSet.readLong(ITEM_ID_COLUMN));
item.setPrice(fieldSet.readBigDecimal(PRICE_COLUMN));
item.setDiscountPerc(fieldSet.readBigDecimal(DISCOUNT_PERC_COLUMN));
item.setDiscountAmount(fieldSet.readBigDecimal(DISCOUNT_AMOUNT_COLUMN));
item.setShippingPrice(fieldSet.readBigDecimal(SHIPPING_PRICE_COLUMN));
item.setHandlingPrice(fieldSet.readBigDecimal(HANDLING_PRICE_COLUMN));
item.setQuantity(fieldSet.readInt(QUANTITY_COLUMN));
item.setTotalPrice(fieldSet.readBigDecimal(TOTAL_PRICE_COLUMN));
return item;
}
}

View File

@@ -14,27 +14,25 @@
* limitations under the License.
*/
package org.springframework.batch.sample.domain.order.internal;
package org.springframework.batch.sample.domain.order.internal.mapper;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.batch.sample.domain.order.ShippingInfo;
public class ShippingFieldSetMapper implements FieldSetMapper<ShippingInfo> {
public static final String ADDITIONAL_SHIPPING_INFO_COLUMN = "ADDITIONAL_SHIPPING_INFO";
public static final String ADDITIONAL_SHIPPING_INFO_COLUMN = "ADDITIONAL_SHIPPING_INFO";
public static final String SHIPPING_TYPE_ID_COLUMN = "SHIPPING_TYPE_ID";
public static final String SHIPPER_ID_COLUMN = "SHIPPER_ID";
public ShippingInfo mapFieldSet(FieldSet fieldSet) {
ShippingInfo info = new ShippingInfo();
ShippingInfo info = new ShippingInfo();
info.setShipperId(fieldSet.readString(SHIPPER_ID_COLUMN));
info.setShippingTypeId(fieldSet.readString(SHIPPING_TYPE_ID_COLUMN));
info.setShippingInfo(fieldSet.readString(ADDITIONAL_SHIPPING_INFO_COLUMN));
info.setShipperId(fieldSet.readString(SHIPPER_ID_COLUMN));
info.setShippingTypeId(fieldSet.readString(SHIPPING_TYPE_ID_COLUMN));
info.setShippingInfo(fieldSet.readString(ADDITIONAL_SHIPPING_INFO_COLUMN));
return info;
}
return info;
}
}