diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemReader.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemReader.java index c5c87dfc1..d846fa6a4 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemReader.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemReader.java @@ -52,7 +52,7 @@ public class OrderItemReader implements ItemReader { private FieldSetMapper itemMapper; private FieldSetMapper shippingMapper; - + private ItemReader
fieldSetReader; /** @@ -67,7 +67,7 @@ public class OrderItemReader implements ItemReader { } log.info("Mapped: " + order); - + Order result = order; order = null; @@ -80,7 +80,6 @@ public class OrderItemReader implements ItemReader { log.debug("FINISHED"); recordFinished = true; order = null; - return; } @@ -90,12 +89,8 @@ public class OrderItemReader implements ItemReader { 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.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()); } 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
fieldSetReader) { this.fieldSetReader = fieldSetReader; diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderProcessor.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderProcessor.java index 2405e82f1..5a6c656c7 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderProcessor.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderProcessor.java @@ -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> { /** * Aggregators for all types of lines in the output file */ - private Map> aggregators; + private Map> aggregators; /** * Converts information from an Order object to a collection of Strings for * output. - * @throws Exception + * + * @throws Exception */ public List process(Order order) throws Exception { List result = new ArrayList(); - 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 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> aggregators) { + public void setAggregators(Map> aggregators) { this.aggregators = aggregators; } - private LineAggregator getAggregator(String name) { - return aggregators.get(name); - } - - /** - * Utility class encapsulating formatting of Order 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() }; - } - } - } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/AddressFieldExtractor.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/AddressFieldExtractor.java new file mode 100644 index 000000000..e100431f8 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/AddressFieldExtractor.java @@ -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 { + + public Object[] extract(Order order) { + Address address = order.getBillingAddress(); + return new Object[] { "ADDRESS:", address.getAddrLine1(), address.getCity(), address.getZipCode() }; + } + +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/BillingInfoFieldExtractor.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/BillingInfoFieldExtractor.java new file mode 100644 index 000000000..411442532 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/BillingInfoFieldExtractor.java @@ -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 { + + public Object[] extract(Order order) { + BillingInfo billingInfo = order.getBilling(); + return new Object[] { "BILLING:", billingInfo.getPaymentId(), billingInfo.getPaymentDesc() }; + } + +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/CustomerFieldExtractor.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/CustomerFieldExtractor.java new file mode 100644 index 000000000..7c06489c4 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/CustomerFieldExtractor.java @@ -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 { + + 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 : ""; + } + +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/FooterFieldExtractor.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/FooterFieldExtractor.java new file mode 100644 index 000000000..f8295e29d --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/FooterFieldExtractor.java @@ -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 { + + public Object[] extract(Order order) { + return new Object[] { "END_ORDER:", order.getTotalPrice() }; + } + +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/HeaderFieldExtractor.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/HeaderFieldExtractor.java new file mode 100644 index 000000000..61923c215 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/HeaderFieldExtractor.java @@ -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 { + + 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()) }; + } + +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/LineItemFieldExtractor.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/LineItemFieldExtractor.java new file mode 100644 index 000000000..3fa8cf67d --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/extractor/LineItemFieldExtractor.java @@ -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 { + + public Object[] extract(LineItem item) { + return new Object[] { "ITEM:", item.getItemId(), item.getPrice() }; + } + +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/AddressFieldSetMapper.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/AddressFieldSetMapper.java similarity index 66% rename from spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/AddressFieldSetMapper.java rename to spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/AddressFieldSetMapper.java index 6161fb5b0..4ff9079d9 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/AddressFieldSetMapper.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/AddressFieldSetMapper.java @@ -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
{ - + 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
{ 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; + } } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/BillingFieldSetMapper.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/BillingFieldSetMapper.java similarity index 75% rename from spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/BillingFieldSetMapper.java rename to spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/BillingFieldSetMapper.java index a01f535f9..3c28a35d8 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/BillingFieldSetMapper.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/BillingFieldSetMapper.java @@ -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 { - + 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; + } } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/CustomerFieldSetMapper.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/CustomerFieldSetMapper.java similarity index 57% rename from spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/CustomerFieldSetMapper.java rename to spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/CustomerFieldSetMapper.java index b70fe13c9..1d7f3c077 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/CustomerFieldSetMapper.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/CustomerFieldSetMapper.java @@ -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 { - + 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 { 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; + } } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/HeaderFieldSetMapper.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/HeaderFieldSetMapper.java similarity index 76% rename from spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/HeaderFieldSetMapper.java rename to spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/HeaderFieldSetMapper.java index 470485246..168b68d65 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/HeaderFieldSetMapper.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/HeaderFieldSetMapper.java @@ -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 { - + 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; + } } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemFieldSetMapper.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/OrderItemFieldSetMapper.java similarity index 65% rename from spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemFieldSetMapper.java rename to spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/OrderItemFieldSetMapper.java index bf6b29c50..86a3d3d8f 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemFieldSetMapper.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/OrderItemFieldSetMapper.java @@ -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 { - + 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 { 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; + } } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/ShippingFieldSetMapper.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/ShippingFieldSetMapper.java similarity index 70% rename from spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/ShippingFieldSetMapper.java rename to spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/ShippingFieldSetMapper.java index b91ce2d65..6bc319bfe 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/ShippingFieldSetMapper.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/mapper/ShippingFieldSetMapper.java @@ -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 { - - 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; + } } diff --git a/spring-batch-samples/src/main/resources/data/multilineOrderJob/input/20070122.teststream.multilineOrderStep.txt b/spring-batch-samples/src/main/resources/data/multilineOrderJob/input/multilineOrderInput.txt similarity index 94% rename from spring-batch-samples/src/main/resources/data/multilineOrderJob/input/20070122.teststream.multilineOrderStep.txt rename to spring-batch-samples/src/main/resources/data/multilineOrderJob/input/multilineOrderInput.txt index 51e386074..d57b1ab36 100755 --- a/spring-batch-samples/src/main/resources/data/multilineOrderJob/input/20070122.teststream.multilineOrderStep.txt +++ b/spring-batch-samples/src/main/resources/data/multilineOrderJob/input/multilineOrderInput.txt @@ -1,4 +1,3 @@ -FHE;20070215-0001;2007-02-15 HEA;0013100345;2007-02-15 NCU;Smith;Peter;;T;20014539;F BAD;;Oak Street 31/A;;Small Town;00235;IL;US @@ -19,4 +18,3 @@ LIT;2134747319;55.29;10;0;7.99;2.99;6;364.45 LIT;1044359501;339.99;10;0;7.99;2.99;2;633.94 SIN;FEDX;AMS; FOT;5;36;14043.74 -FFT;2;14311.08 diff --git a/spring-batch-samples/src/main/resources/data/multilineOrderJob/result/multilineOrderOutput.txt b/spring-batch-samples/src/main/resources/data/multilineOrderJob/result/multilineOrderOutput.txt new file mode 100644 index 000000000..ec3465754 --- /dev/null +++ b/spring-batch-samples/src/main/resources/data/multilineOrderJob/result/multilineOrderOutput.txt @@ -0,0 +1,17 @@ +BEGIN_ORDER:13100345 2007/02/15 +CUSTOMER:20014539 Peter Smith +ADDRESS:Oak Street 31/A Small Town00235 +BILLING:VISA VISA-12345678903 +ITEM:104439104137.49 +ITEM:2134776319221.99 +END_ORDER: 267.34 +BEGIN_ORDER:13100346 2007/02/15 +CUSTOMER:72155919 +ADDRESS:St. Andrews Road 31 London 55342 +BILLING:AMEX AMEX-72345678903 +ITEM:10443191011070.50 +ITEM:213472721921.79 +ITEM:104433930179.95 +ITEM:213474731955.29 +ITEM:1044359501339.99 +END_ORDER: 14043.74 diff --git a/spring-batch-samples/src/main/resources/jobs/iosample/multiLine.xml b/spring-batch-samples/src/main/resources/jobs/iosample/multiLine.xml index 26b0dc1aa..359a769a8 100644 --- a/spring-batch-samples/src/main/resources/jobs/iosample/multiLine.xml +++ b/spring-batch-samples/src/main/resources/jobs/iosample/multiLine.xml @@ -21,21 +21,17 @@ - + - + - + - + @@ -43,15 +39,12 @@ - + - + - + diff --git a/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml b/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml index 07259bbfe..bb477a2b3 100644 --- a/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml +++ b/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml @@ -3,8 +3,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> - + @@ -16,17 +15,14 @@ - + - - + - + @@ -63,8 +59,7 @@ - + \ No newline at end of file diff --git a/spring-batch-samples/src/main/resources/jobs/multilineOrderIo.xml b/spring-batch-samples/src/main/resources/jobs/multilineOrderIo.xml deleted file mode 100644 index 1e4240fac..000000000 --- a/spring-batch-samples/src/main/resources/jobs/multilineOrderIo.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-batch-samples/src/main/resources/jobs/multilineOrderJob.xml b/spring-batch-samples/src/main/resources/jobs/multilineOrderJob.xml index 2be5fb4a8..e7ca33532 100644 --- a/spring-batch-samples/src/main/resources/jobs/multilineOrderJob.xml +++ b/spring-batch-samples/src/main/resources/jobs/multilineOrderJob.xml @@ -1,5 +1,5 @@ - - - - + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - + + + + + + - - - - - - 0 AND ? <= 9999999999 : 'Incorrect order ID' : 'error.order.id' } - { orderDate : isFutureDate(?) = FALSE : 'Future date is not allowed' : 'error.order.date.future' } - { totalLines : ? = size(lineItems) : 'Bad count of order lines' : 'error.order.lines.badcount'} + + + + + + + + + + + + - { customer.registered : customer.businessCustomer = FALSE OR ? = TRUE : 'Business customer must be registered' : 'error.customer.registration'} - { customer.companyName : customer.businessCustomer = FALSE OR ? HAS TEXT : 'Company name for business customer is mandatory' : 'error.customer.companyname'} - { customer.firstName : customer.businessCustomer = TRUE OR ? HAS TEXT : 'Firstname for non-business customer is mandatory' : 'error.customer.firstname'} - { customer.lastName : customer.businessCustomer = TRUE OR ? HAS TEXT : 'Lastname name for non-business customer is mandatory' : 'error.customer.lastname'} - { customer.registrationId : customer.registered = FALSE OR (? > 0 AND ? < 99999999) : 'Incorrect registration ID' : 'error.customer.registrationid'} + + + + + + - { billingAddress.addressee : ? HAS NO TEXT OR length(?) <= 60 : 'Maximum length for Addressee is 60 characters' : 'error.baddress.addresse.length'} - { billingAddress.addrLine1 : ? HAS TEXT AND length(?) <= 50 : 'Address line1 is mandatory and maximum length for address line1 is 50 characters' : 'error.baddress.addrline1.length'} - { billingAddress.addrLine2 : ? HAS NO TEXT OR length(?) <= 50 : 'Maximum length for address line2 is 50 characters' : 'error.baddress.addrline2.length'} - { billingAddress.city : ? HAS TEXT AND length(?) <= 30 : 'City is mandatory and maximum length for city is 30 characters' : 'error.baddress.city.length'} - { billingAddress.zipCode : ? HAS TEXT AND length(?) <= 50 : 'Zipcode is mandatory and maximum length for zipcode is 5 characters' : 'error.baddress.zipcode.length'} - { billingAddress.zipCode : match('[0-9]{5}',?) = TRUE : 'ZipCode must contain exactly 5 digits' : 'error.baddress.zipcode.format'} - { billingAddress.state : (? HAS NO TEXT AND billingAddress.country != 'United States') OR (? HAS TEXT AND length(?) <= 2) : 'Maximum length for state is 2 characters' : 'error.baddress.state.length'} - { billingAddress.country : ? HAS TEXT AND length(?) <= 50 : 'Country is mandatory and maximum length for country is 50 characters' : 'error.baddress.country.length'} - - { shippingAddress.addressee : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 60) : 'Addressee is mandatory and maximum length for addressee is 60 characters' : 'error.saddress.addresse.length'} - { shippingAddress.addrLine1 : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 50) : 'Address line1 is mandatory and maximum length for address line1 is 50 characters' : 'error.baddress.addrline1.length'} - { shippingAddress.addrLine2 : shippingAddress IS NULL OR (? HAS NO TEXT OR length(?) <= 50) : 'Maximum length for address line2 is 50 characters' : 'error.baddress.addrline2.length'} - { shippingAddress.city : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 30) : 'City is mandatory and maximum length for city is 30 characters' : 'error.baddress.city.length'} - { shippingAddress.zipCode : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 50) : 'Zipcode is mandatory and maximum length for zipcode is 5 characters' : 'error.baddress.zipcode.length'} - { shippingAddress.zipCode : shippingAddress IS NULL OR (match('[0-9]{5}',?) = TRUE) : 'Zipcode must contain exactly 5 digits' : 'error.baddress.zipcode.format'} - { shippingAddress.state : shippingAddress IS NULL OR ((? HAS NO TEXT AND billingAddress.country != 'United States') OR (? HAS TEXT AND length(?) <= 2)) : 'Maximum length for state is 2 characters' : 'error.baddress.state.length'} - { shippingAddress.country : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 50) : 'Country is mandatory and maximum length for country is 50 characters' : 'error.baddress.country.length'} - - { billing.paymentId : ? IN 'VISA','AMEX','ECMC','DCIN','PAYP' : 'Invalid payment type' : 'error.billing.type' } - { billing.paymentDesc : match('[A-Z]{4}-[0-9]{10,11}',?) = TRUE : 'Invalid format of payment description' : 'error.billing.desc' } - - { shipping.shipperId : ? IN 'FEDX', 'UPS', 'DHL', 'DPD' : 'Invalid shipper ID' : 'error.shipping.shipper'} - { shipping.shippingTypeId : ? IN 'STD', 'EXP', 'AMS', 'AME' : 'Invalid shipping type' : 'error.shipping.type' } - { shipping.shippingInfo : ? HAS NO TEXT OR length(?) <= 100 : 'Maximum length for additional shipping info is 100 characters' } - - { lineItems : validateTotalItemsCount(totalItems,?) = TRUE : 'Bad count of total line items' : 'error.lineitems.badcount' } - { lineItems : validateIds(?) = TRUE : 'One or more invalid item IDs' : 'error.lineitems.id' } - { lineItems : validatePrices(?) = TRUE : 'One or more invalid item prices' : 'error.lineitems.price' } - { lineItems : validateDiscounts(?) = TRUE : 'One or more invalid item discounts' : 'error.lineitems.discount' } - { lineItems : validateShippingPrices(?) = TRUE : 'One or more invalid item shipping prices' : 'error.lineitems.shipping' } - { lineItems : validateHandlingPrices(?) = TRUE : 'One or more invalid item handling prices' : 'error.lineitems.handling' } - { lineItems : validateQuantities(?) = TRUE : 'One or more invalid item quantities' : 'error.lineitems.quantity' } - { lineItems : validateTotalPrices(?) = TRUE : 'One or more invalid item total prices' : 'error.lineitems.totalprice' } - ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/spring-batch-samples/src/main/resources/jobs/multilineOrderOutputAggregators.xml b/spring-batch-samples/src/main/resources/jobs/multilineOrderOutputAggregators.xml index cc38e734f..e0dd2ec40 100644 --- a/spring-batch-samples/src/main/resources/jobs/multilineOrderOutputAggregators.xml +++ b/spring-batch-samples/src/main/resources/jobs/multilineOrderOutputAggregators.xml @@ -6,34 +6,56 @@ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> - - + + - - - + + + - + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-batch-samples/src/main/resources/jobs/multilineOrderValidator.xml b/spring-batch-samples/src/main/resources/jobs/multilineOrderValidator.xml new file mode 100644 index 000000000..2b71eb4c4 --- /dev/null +++ b/spring-batch-samples/src/main/resources/jobs/multilineOrderValidator.xml @@ -0,0 +1,76 @@ + + + + + + + + + + 0 AND ? <= 9999999999 : 'Incorrect order ID' : 'error.order.id' } + { orderDate : isFutureDate(?) = FALSE : 'Future date is not allowed' : 'error.order.date.future' } + { totalLines : ? = size(lineItems) : 'Bad count of order lines' : 'error.order.lines.badcount'} + + { customer.registered : customer.businessCustomer = FALSE OR ? = TRUE : 'Business customer must be registered' : 'error.customer.registration'} + { customer.companyName : customer.businessCustomer = FALSE OR ? HAS TEXT : 'Company name for business customer is mandatory' : 'error.customer.companyname'} + { customer.firstName : customer.businessCustomer = TRUE OR ? HAS TEXT : 'Firstname for non-business customer is mandatory' : 'error.customer.firstname'} + { customer.lastName : customer.businessCustomer = TRUE OR ? HAS TEXT : 'Lastname name for non-business customer is mandatory' : 'error.customer.lastname'} + { customer.registrationId : customer.registered = FALSE OR (? > 0 AND ? < 99999999) : 'Incorrect registration ID' : 'error.customer.registrationid'} + + { billingAddress.addressee : ? HAS NO TEXT OR length(?) <= 60 : 'Maximum length for Addressee is 60 characters' : 'error.baddress.addresse.length'} + { billingAddress.addrLine1 : ? HAS TEXT AND length(?) <= 50 : 'Address line1 is mandatory and maximum length for address line1 is 50 characters' : 'error.baddress.addrline1.length'} + { billingAddress.addrLine2 : ? HAS NO TEXT OR length(?) <= 50 : 'Maximum length for address line2 is 50 characters' : 'error.baddress.addrline2.length'} + { billingAddress.city : ? HAS TEXT AND length(?) <= 30 : 'City is mandatory and maximum length for city is 30 characters' : 'error.baddress.city.length'} + { billingAddress.zipCode : ? HAS TEXT AND length(?) <= 50 : 'Zipcode is mandatory and maximum length for zipcode is 5 characters' : 'error.baddress.zipcode.length'} + { billingAddress.zipCode : match('[0-9]{5}',?) = TRUE : 'ZipCode must contain exactly 5 digits' : 'error.baddress.zipcode.format'} + { billingAddress.state : (? HAS NO TEXT AND billingAddress.country != 'United States') OR (? HAS TEXT AND length(?) <= 2) : 'Maximum length for state is 2 characters' : 'error.baddress.state.length'} + { billingAddress.country : ? HAS TEXT AND length(?) <= 50 : 'Country is mandatory and maximum length for country is 50 characters' : 'error.baddress.country.length'} + + { shippingAddress.addressee : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 60) : 'Addressee is mandatory and maximum length for addressee is 60 characters' : 'error.saddress.addresse.length'} + { shippingAddress.addrLine1 : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 50) : 'Address line1 is mandatory and maximum length for address line1 is 50 characters' : 'error.baddress.addrline1.length'} + { shippingAddress.addrLine2 : shippingAddress IS NULL OR (? HAS NO TEXT OR length(?) <= 50) : 'Maximum length for address line2 is 50 characters' : 'error.baddress.addrline2.length'} + { shippingAddress.city : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 30) : 'City is mandatory and maximum length for city is 30 characters' : 'error.baddress.city.length'} + { shippingAddress.zipCode : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 50) : 'Zipcode is mandatory and maximum length for zipcode is 5 characters' : 'error.baddress.zipcode.length'} + { shippingAddress.zipCode : shippingAddress IS NULL OR (match('[0-9]{5}',?) = TRUE) : 'Zipcode must contain exactly 5 digits' : 'error.baddress.zipcode.format'} + { shippingAddress.state : shippingAddress IS NULL OR ((? HAS NO TEXT AND billingAddress.country != 'United States') OR (? HAS TEXT AND length(?) <= 2)) : 'Maximum length for state is 2 characters' : 'error.baddress.state.length'} + { shippingAddress.country : shippingAddress IS NULL OR (? HAS TEXT AND length(?) <= 50) : 'Country is mandatory and maximum length for country is 50 characters' : 'error.baddress.country.length'} + + { billing.paymentId : ? IN 'VISA','AMEX','ECMC','DCIN','PAYP' : 'Invalid payment type' : 'error.billing.type' } + { billing.paymentDesc : match('[A-Z]{4}-[0-9]{10,11}',?) = TRUE : 'Invalid format of payment description' : 'error.billing.desc' } + + { shipping.shipperId : ? IN 'FEDX', 'UPS', 'DHL', 'DPD' : 'Invalid shipper ID' : 'error.shipping.shipper'} + { shipping.shippingTypeId : ? IN 'STD', 'EXP', 'AMS', 'AME' : 'Invalid shipping type' : 'error.shipping.type' } + { shipping.shippingInfo : ? HAS NO TEXT OR length(?) <= 100 : 'Maximum length for additional shipping info is 100 characters' } + + { lineItems : validateTotalItemsCount(totalItems,?) = TRUE : 'Bad count of total line items' : 'error.lineitems.badcount' } + { lineItems : validateIds(?) = TRUE : 'One or more invalid item IDs' : 'error.lineitems.id' } + { lineItems : validatePrices(?) = TRUE : 'One or more invalid item prices' : 'error.lineitems.price' } + { lineItems : validateDiscounts(?) = TRUE : 'One or more invalid item discounts' : 'error.lineitems.discount' } + { lineItems : validateShippingPrices(?) = TRUE : 'One or more invalid item shipping prices' : 'error.lineitems.shipping' } + { lineItems : validateHandlingPrices(?) = TRUE : 'One or more invalid item handling prices' : 'error.lineitems.handling' } + { lineItems : validateQuantities(?) = TRUE : 'One or more invalid item quantities' : 'error.lineitems.quantity' } + { lineItems : validateTotalPrices(?) = TRUE : 'One or more invalid item total prices' : 'error.lineitems.totalprice' } + ]]> + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/MultilineOrderJobFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/MultilineOrderJobFunctionalTests.java index de877b3e6..36f84ce9a 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/MultilineOrderJobFunctionalTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/MultilineOrderJobFunctionalTests.java @@ -16,50 +16,27 @@ package org.springframework.batch.sample; -import static org.junit.Assert.assertEquals; +import static org.springframework.batch.test.AssertFile.assertFileEquals; -import java.io.IOException; - -import org.apache.commons.io.IOUtils; +import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.batch.test.AbstractJobTests; +import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.util.StringUtils; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration() -public class MultilineOrderJobFunctionalTests extends AbstractValidatingBatchLauncherTests { +public class MultilineOrderJobFunctionalTests extends AbstractJobTests { - private static final String EXPECTED_OUTPUT = - "BEGIN_ORDER:13100345 2007/02/15 "+ - "CUSTOMER:20014539 Peter Smith "+ - "ADDRESS:Oak Street 31/A Small Town00235 "+ - "BILLING:VISA VISA-12345678903 "+ - "ITEM:104439104137.49 "+ - "ITEM:2134776319221.99 "+ - "END_ORDER: 267.34"+ - "BEGIN_ORDER:13100346 2007/02/15 "+ - "CUSTOMER:72155919 "+ - "ADDRESS:St. Andrews Road 31 London 55342 "+ - "BILLING:AMEX AMEX-72345678903 "+ - "ITEM:10443191011070.50 "+ - "ITEM:213472721921.79 "+ - "ITEM:104433930179.95 "+ - "ITEM:213474731955.29 "+ - "ITEM:1044359501339.99 "+ - "END_ORDER: 14043.74"; + private static final String ACTUAL = "target/test-outputs/multilineOrderOutput.txt"; + private static final String EXPECTED = "data/multilineOrderJob/result/multilineOrderOutput.txt"; - - private Resource fileOutputLocator = new FileSystemResource("target/test-outputs/20070122.teststream.multilineOrderStep.TEMP.txt"); - - /** - * Read the output file and compare it with expected string - * @throws IOException - */ - protected void validatePostConditions() throws Exception { - assertEquals(EXPECTED_OUTPUT, StringUtils.replace(IOUtils.toString(fileOutputLocator.getInputStream()), System.getProperty("line.separator"), "")); + @Test + public void testJob() throws Exception { + this.launchJob(); + assertFileEquals(new ClassPathResource(EXPECTED), new FileSystemResource(ACTUAL)); } } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/AddressFieldSetMapperTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/AddressFieldSetMapperTests.java index a21b3387e..251689b05 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/AddressFieldSetMapperTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/AddressFieldSetMapperTests.java @@ -3,10 +3,9 @@ package org.springframework.batch.sample.domain.order; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.DefaultFieldSet; import org.springframework.batch.item.file.transform.FieldSet; -import org.springframework.batch.sample.domain.order.internal.AddressFieldSetMapper; +import org.springframework.batch.sample.domain.order.internal.mapper.AddressFieldSetMapper; import org.springframework.batch.sample.support.AbstractFieldSetMapperTests; - public class AddressFieldSetMapperTests extends AbstractFieldSetMapperTests { private static final String ADDRESSEE = "Jan Hrach"; @@ -16,8 +15,6 @@ public class AddressFieldSetMapperTests extends AbstractFieldSetMapperTests { private static final String STATE = ""; private static final String COUNTRY = "Slovakia"; private static final String ZIP_CODE = "80000"; - - protected Object expectedDomainObject() { Address address = new Address(); @@ -32,19 +29,13 @@ public class AddressFieldSetMapperTests extends AbstractFieldSetMapperTests { } protected FieldSet fieldSet() { - String[] tokens = - new String[]{ADDRESSEE, ADDRESS_LINE_1, ADDRESS_LINE_2, CITY, STATE, COUNTRY, ZIP_CODE}; - String[] columnNames = - new String[]{ - AddressFieldSetMapper.ADDRESSEE_COLUMN, - AddressFieldSetMapper.ADDRESS_LINE1_COLUMN, - AddressFieldSetMapper.ADDRESS_LINE2_COLUMN, - AddressFieldSetMapper.CITY_COLUMN, - AddressFieldSetMapper.STATE_COLUMN, - AddressFieldSetMapper.COUNTRY_COLUMN, - AddressFieldSetMapper.ZIP_CODE_COLUMN }; - - return new DefaultFieldSet(tokens, columnNames); + String[] tokens = new String[] { ADDRESSEE, ADDRESS_LINE_1, ADDRESS_LINE_2, CITY, STATE, COUNTRY, ZIP_CODE }; + String[] columnNames = new String[] { AddressFieldSetMapper.ADDRESSEE_COLUMN, + AddressFieldSetMapper.ADDRESS_LINE1_COLUMN, AddressFieldSetMapper.ADDRESS_LINE2_COLUMN, + AddressFieldSetMapper.CITY_COLUMN, AddressFieldSetMapper.STATE_COLUMN, + AddressFieldSetMapper.COUNTRY_COLUMN, AddressFieldSetMapper.ZIP_CODE_COLUMN }; + + return new DefaultFieldSet(tokens, columnNames); } protected FieldSetMapper
fieldSetMapper() { diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/BillingFieldSetMapperTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/BillingFieldSetMapperTests.java index e4024016d..3370d1975 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/BillingFieldSetMapperTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/BillingFieldSetMapperTests.java @@ -3,14 +3,14 @@ package org.springframework.batch.sample.domain.order; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.DefaultFieldSet; import org.springframework.batch.item.file.transform.FieldSet; -import org.springframework.batch.sample.domain.order.internal.BillingFieldSetMapper; +import org.springframework.batch.sample.domain.order.internal.mapper.BillingFieldSetMapper; import org.springframework.batch.sample.support.AbstractFieldSetMapperTests; -public class BillingFieldSetMapperTests extends AbstractFieldSetMapperTests{ +public class BillingFieldSetMapperTests extends AbstractFieldSetMapperTests { private static final String PAYMENT_ID = "777"; private static final String PAYMENT_DESC = "My last penny"; - + protected Object expectedDomainObject() { BillingInfo bInfo = new BillingInfo(); bInfo.setPaymentDesc(PAYMENT_DESC); @@ -19,12 +19,9 @@ public class BillingFieldSetMapperTests extends AbstractFieldSetMapperTests{ } protected FieldSet fieldSet() { - String[] tokens = new String[]{ - PAYMENT_ID, - PAYMENT_DESC}; - String[] columnNames = new String[]{ - BillingFieldSetMapper.PAYMENT_TYPE_ID_COLUMN, - BillingFieldSetMapper.PAYMENT_DESC_COLUMN}; + String[] tokens = new String[] { PAYMENT_ID, PAYMENT_DESC }; + String[] columnNames = new String[] { BillingFieldSetMapper.PAYMENT_TYPE_ID_COLUMN, + BillingFieldSetMapper.PAYMENT_DESC_COLUMN }; return new DefaultFieldSet(tokens, columnNames); } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/CustomerFieldSetMapperTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/CustomerFieldSetMapperTests.java index 97527ac4d..2a5d06037 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/CustomerFieldSetMapperTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/CustomerFieldSetMapperTests.java @@ -3,13 +3,12 @@ package org.springframework.batch.sample.domain.order; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.DefaultFieldSet; import org.springframework.batch.item.file.transform.FieldSet; -import org.springframework.batch.sample.domain.order.internal.CustomerFieldSetMapper; +import org.springframework.batch.sample.domain.order.internal.mapper.CustomerFieldSetMapper; import org.springframework.batch.sample.support.AbstractFieldSetMapperTests; public class CustomerFieldSetMapperTests extends AbstractFieldSetMapperTests { private static final boolean BUSINESS_CUSTOMER = false; - //private static final String COMPANY_NAME = "Accenture"; private static final String FIRST_NAME = "Jan"; private static final String LAST_NAME = "Hrach"; private static final String MIDDLE_NAME = ""; @@ -30,23 +29,13 @@ public class CustomerFieldSetMapperTests extends AbstractFieldSetMapperTests { } protected FieldSet fieldSet() { - String[] tokens = new String[]{ - Customer.LINE_ID_NON_BUSINESS_CUST, - FIRST_NAME, - LAST_NAME, - MIDDLE_NAME, - CustomerFieldSetMapper.TRUE_SYMBOL, - String.valueOf(REG_ID), - CustomerFieldSetMapper.TRUE_SYMBOL}; - String[] columnNames = new String[]{ - CustomerFieldSetMapper.LINE_ID_COLUMN, - CustomerFieldSetMapper.FIRST_NAME_COLUMN, - CustomerFieldSetMapper.LAST_NAME_COLUMN, - CustomerFieldSetMapper.MIDDLE_NAME_COLUMN, - CustomerFieldSetMapper.REGISTERED_COLUMN, - CustomerFieldSetMapper.REG_ID_COLUMN, - CustomerFieldSetMapper.VIP_COLUMN}; - + String[] tokens = new String[] { Customer.LINE_ID_NON_BUSINESS_CUST, FIRST_NAME, LAST_NAME, MIDDLE_NAME, + CustomerFieldSetMapper.TRUE_SYMBOL, String.valueOf(REG_ID), CustomerFieldSetMapper.TRUE_SYMBOL }; + String[] columnNames = new String[] { CustomerFieldSetMapper.LINE_ID_COLUMN, + CustomerFieldSetMapper.FIRST_NAME_COLUMN, CustomerFieldSetMapper.LAST_NAME_COLUMN, + CustomerFieldSetMapper.MIDDLE_NAME_COLUMN, CustomerFieldSetMapper.REGISTERED_COLUMN, + CustomerFieldSetMapper.REG_ID_COLUMN, CustomerFieldSetMapper.VIP_COLUMN }; + return new DefaultFieldSet(tokens, columnNames); } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/FlatFileOrderAggregatorTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/FlatFileOrderAggregatorTests.java deleted file mode 100644 index a91708ca3..000000000 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/FlatFileOrderAggregatorTests.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2006-2008 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.sample.domain.order; - -import static org.junit.Assert.assertEquals; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.junit.Test; -import org.springframework.batch.item.file.transform.DelimitedLineAggregator; -import org.springframework.batch.item.file.transform.LineAggregator; -import org.springframework.batch.sample.domain.order.internal.OrderProcessor; - -public class FlatFileOrderAggregatorTests { - - @Test - public void testWrite() throws Exception { - - // Create and set-up Order - Order order = new Order(); - - order.setOrderDate(new GregorianCalendar(2007, GregorianCalendar.JUNE, 1).getTime()); - order.setCustomer(new Customer()); - order.setBilling(new BillingInfo()); - order.setBillingAddress(new Address()); - List lineItems = new ArrayList(); - LineItem item = new LineItem(); - item.setPrice(BigDecimal.valueOf(0)); - lineItems.add(item); - lineItems.add(item); - order.setLineItems(lineItems); - order.setTotalPrice(BigDecimal.valueOf(0)); - - // create aggregator stub - LineAggregator aggregator = new DelimitedLineAggregator(); - - // create map of aggregators and set it to writer - Map> aggregators = new HashMap>(); - - OrderProcessor converter = new OrderProcessor(); - aggregators.put("header", aggregator); - aggregators.put("customer", aggregator); - aggregators.put("address", aggregator); - aggregators.put("billing", aggregator); - aggregators.put("item", aggregator); - aggregators.put("footer", aggregator); - converter.setAggregators(aggregators); - - // call tested method - List list = converter.process(order); - - // verify method calls - assertEquals(7, list.size()); - assertEquals("BEGIN_ORDER:,0,2007/06/01", list.get(0)); - - } - -} diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/HeaderFieldSetMapperTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/HeaderFieldSetMapperTests.java index 41f2ce666..0adf78be9 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/HeaderFieldSetMapperTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/HeaderFieldSetMapperTests.java @@ -5,7 +5,7 @@ import java.util.Calendar; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.DefaultFieldSet; import org.springframework.batch.item.file.transform.FieldSet; -import org.springframework.batch.sample.domain.order.internal.HeaderFieldSetMapper; +import org.springframework.batch.sample.domain.order.internal.mapper.HeaderFieldSetMapper; import org.springframework.batch.sample.support.AbstractFieldSetMapperTests; public class HeaderFieldSetMapperTests extends AbstractFieldSetMapperTests { @@ -24,14 +24,9 @@ public class HeaderFieldSetMapperTests extends AbstractFieldSetMapperTests { } protected FieldSet fieldSet() { - String[] tokens = new String[]{ - String.valueOf(ORDER_ID), - DATE - }; - String[] columnNames = new String[]{ - HeaderFieldSetMapper.ORDER_ID_COLUMN, - HeaderFieldSetMapper.ORDER_DATE_COLUMN - }; + String[] tokens = new String[] { String.valueOf(ORDER_ID), DATE }; + String[] columnNames = new String[] { HeaderFieldSetMapper.ORDER_ID_COLUMN, + HeaderFieldSetMapper.ORDER_DATE_COLUMN }; return new DefaultFieldSet(tokens, columnNames); } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/OrderItemFieldSetMapperTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/OrderItemFieldSetMapperTests.java index 36f8ee4af..b023f692d 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/OrderItemFieldSetMapperTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/OrderItemFieldSetMapperTests.java @@ -5,10 +5,10 @@ import java.math.BigDecimal; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.DefaultFieldSet; import org.springframework.batch.item.file.transform.FieldSet; -import org.springframework.batch.sample.domain.order.internal.OrderItemFieldSetMapper; +import org.springframework.batch.sample.domain.order.internal.mapper.OrderItemFieldSetMapper; import org.springframework.batch.sample.support.AbstractFieldSetMapperTests; -public class OrderItemFieldSetMapperTests extends AbstractFieldSetMapperTests{ +public class OrderItemFieldSetMapperTests extends AbstractFieldSetMapperTests { private static final BigDecimal DISCOUNT_AMOUNT = new BigDecimal("1"); private static final BigDecimal DISCOUNT_PERC = new BigDecimal("2"); @@ -33,26 +33,14 @@ public class OrderItemFieldSetMapperTests extends AbstractFieldSetMapperTests{ } protected FieldSet fieldSet() { - String[] tokens = new String[]{ - String.valueOf(DISCOUNT_AMOUNT), - String.valueOf(DISCOUNT_PERC), - String.valueOf(HANDLING_PRICE), - String.valueOf(ITEM_ID), - String.valueOf(PRICE), - String.valueOf(QUANTITY), - String.valueOf(SHIPPING_PRICE), - String.valueOf(TOTAL_PRICE) - }; - String[] columnNames = new String[]{ - OrderItemFieldSetMapper.DISCOUNT_AMOUNT_COLUMN, - OrderItemFieldSetMapper.DISCOUNT_PERC_COLUMN, - OrderItemFieldSetMapper.HANDLING_PRICE_COLUMN, - OrderItemFieldSetMapper.ITEM_ID_COLUMN, - OrderItemFieldSetMapper.PRICE_COLUMN, - OrderItemFieldSetMapper.QUANTITY_COLUMN, - OrderItemFieldSetMapper.SHIPPING_PRICE_COLUMN, - OrderItemFieldSetMapper.TOTAL_PRICE_COLUMN - }; + String[] tokens = new String[] { String.valueOf(DISCOUNT_AMOUNT), String.valueOf(DISCOUNT_PERC), + String.valueOf(HANDLING_PRICE), String.valueOf(ITEM_ID), String.valueOf(PRICE), + String.valueOf(QUANTITY), String.valueOf(SHIPPING_PRICE), String.valueOf(TOTAL_PRICE) }; + String[] columnNames = new String[] { OrderItemFieldSetMapper.DISCOUNT_AMOUNT_COLUMN, + OrderItemFieldSetMapper.DISCOUNT_PERC_COLUMN, OrderItemFieldSetMapper.HANDLING_PRICE_COLUMN, + OrderItemFieldSetMapper.ITEM_ID_COLUMN, OrderItemFieldSetMapper.PRICE_COLUMN, + OrderItemFieldSetMapper.QUANTITY_COLUMN, OrderItemFieldSetMapper.SHIPPING_PRICE_COLUMN, + OrderItemFieldSetMapper.TOTAL_PRICE_COLUMN }; return new DefaultFieldSet(tokens, columnNames); } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/ShippingFieldSetMapperTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/ShippingFieldSetMapperTests.java index 30db269e6..7310f43c3 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/ShippingFieldSetMapperTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/domain/order/ShippingFieldSetMapperTests.java @@ -3,10 +3,10 @@ package org.springframework.batch.sample.domain.order; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.DefaultFieldSet; import org.springframework.batch.item.file.transform.FieldSet; -import org.springframework.batch.sample.domain.order.internal.ShippingFieldSetMapper; +import org.springframework.batch.sample.domain.order.internal.mapper.ShippingFieldSetMapper; import org.springframework.batch.sample.support.AbstractFieldSetMapperTests; -public class ShippingFieldSetMapperTests extends AbstractFieldSetMapperTests{ +public class ShippingFieldSetMapperTests extends AbstractFieldSetMapperTests { private static final String SHIPPER_ID = "1"; private static final String SHIPPING_INFO = "most interesting and informative shipping info ever"; @@ -21,12 +21,9 @@ public class ShippingFieldSetMapperTests extends AbstractFieldSetMapperTests{ } protected FieldSet fieldSet() { - String[] tokens = new String[]{SHIPPER_ID, SHIPPING_INFO, SHIPPING_TYPE_ID}; - String[] columnNames = new String[]{ - ShippingFieldSetMapper.SHIPPER_ID_COLUMN, - ShippingFieldSetMapper.ADDITIONAL_SHIPPING_INFO_COLUMN, - ShippingFieldSetMapper.SHIPPING_TYPE_ID_COLUMN - }; + String[] tokens = new String[] { SHIPPER_ID, SHIPPING_INFO, SHIPPING_TYPE_ID }; + String[] columnNames = new String[] { ShippingFieldSetMapper.SHIPPER_ID_COLUMN, + ShippingFieldSetMapper.ADDITIONAL_SHIPPING_INFO_COLUMN, ShippingFieldSetMapper.SHIPPING_TYPE_ID_COLUMN }; return new DefaultFieldSet(tokens, columnNames); }