OrderConfirmationSearchResultTransformer.java

package com.tradecloud.dto.order;

import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.party.ServiceProvider;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.hibernate.transform.ResultTransformer;

/**
 * Created by ds on 2014/07/10.
 */
public class OrderConfirmationSearchResultTransformer implements ResultTransformer {

    @Override
    public Object transformTuple(Object[] objects, String[] strings) {
        OrderConfirmationSearchResult result = new OrderConfirmationSearchResult();

        result.setConsignmentReference("" + objects[0]);
        result.setOrderReference("" + objects[1]);
        result.setItemReference("" + objects[2]);
        result.setSupplierName("" + objects[3]);
        BigDecimal unitPrice = new BigDecimal("" + objects[4]);
        result.setInvoiceCurrency("" + objects[5]);
        BigDecimal itemQuantity = ((BigDecimal) objects[6]).setScale(2, BigDecimal.ROUND_HALF_UP);
        result.setItemQuantity(itemQuantity);
        result.setItemInvoiceValue(itemQuantity.multiply(unitPrice));
        result.setLatestShipmentDate((Date) objects[7]);
        OrganisationalUnit businessUnit = (OrganisationalUnit) objects[8];
        result.setBusinessUnitName(businessUnit.getName());
        result.setDivisionName("" + objects[9]);
        result.setBuyer(objects[10] + " " + objects[11] );
        ServiceProvider freightForwarder = (ServiceProvider) objects[12];
        result.setFreightForwarder(freightForwarder.getName());
        result.setLspBookingReference("" + objects[13]);
        result.setStatus("" + objects[14]);
        result.setOrderId(new Long("" + objects[15]));



        /*List<OrdersEvent> events = (List<OrdersEvent>) objects[15];
        String rejectReason = "";
        if (events != null) {
            for (OrdersEvent event : events) {
                if (event.getEventType().equals(OrderEventType.LSP_REJECTED_SIGNOFF) ||
                        event.getEventType().equals(OrderEventType.LSP_REJECTED_UNSIGNOFF)) {
                    rejectReason = event.getReason();
                }
            }
        }*/

        result.setRejectReason(objects[15] + " XXX " + objects[16]);
        long id = new Long("" + objects[17]).longValue();
        result.setOrderId(id);


        return result;
    }

    @Override
    public List transformList(List list) {
        //create a map
        HashMap<String, OrderConfirmationSearchResult> map = new HashMap<String, OrderConfirmationSearchResult>();
        List filteredList = new ArrayList();

        //iterate through the list
        for (Object obj : list) {
            OrderConfirmationSearchResult result = (OrderConfirmationSearchResult) obj;
            String key = result.getOrderReference() + result.getItemReference();

            //look for the key, insert if it does not exist
            if (!map.containsKey(key)) {
                result.setRejectReason(getResultRejectReason(result));
                map.put(key, result);
            //if it exists then check for a reject reason
            } else {
                map.get(key).setRejectReason(getResultRejectReason(result));
            }
        }

        for (OrderConfirmationSearchResult result : map.values()) {
            filteredList.add(result);
        }

        return filteredList;
    }

    private String getResultRejectReason(OrderConfirmationSearchResult result) {
        if (result.getRejectReason().contains("LSP_REJECTED_UNSIGNOFF") ||
                result.getRejectReason().contains("LSP_REJECTED_SIGNOFF")) {
            return result.getRejectReason().split(" XXX ")[1];
        }

        return "";
    }
}