CostFormulaSearch.java

package com.tradecloud.dto.costing.costsetup;

import com.tradecloud.common.base.HibernateUtils;
import com.tradecloud.domain.common.Incoterm;
import com.tradecloud.domain.costing.CostLineTemplate;
import com.tradecloud.domain.costing.CostingContextType;
import com.tradecloud.domain.costing.FormulaContainerType;
import com.tradecloud.domain.dto.base.SearchBase;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.model.shipment.ShippingMode;
import com.tradecloud.domain.party.ServiceProvider;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Component
@Scope("view")
public class CostFormulaSearch extends SearchBase implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * Search parameters.
     */
    private List<OrganisationalUnit> organisationalUnits = new ArrayList<OrganisationalUnit>();
    private ShippingMode shippingMode;
    private Incoterm incoterm;
    private CostLineTemplate costLineTemplate;
    private Date effectiveDate;
    private CostingContextType costingContextType;
    private FormulaContainerType containerType;
    private ServiceProvider freightForwarder;
    private boolean exactSearch;

    public CostFormulaSearch(List<OrganisationalUnit> organisationalUnits, ShippingMode shippingMode, Incoterm incoterm,
                             CostLineTemplate costLineTemplate, Date effectiveDate, CostingContextType costingContextType) {
        this.organisationalUnits = organisationalUnits;
        this.shippingMode = shippingMode;
        this.incoterm = incoterm;
        this.costLineTemplate = costLineTemplate;
        this.effectiveDate = effectiveDate;
        this.costingContextType = costingContextType;
    }

    public CostFormulaSearch(List<OrganisationalUnit> organisationalUnits, ShippingMode shippingMode, Incoterm incoterm,
                             CostLineTemplate costLineTemplate, Date effectiveDate, CostingContextType costingContextType,
                             FormulaContainerType containerType, ServiceProvider freightForwarder) {
        this.organisationalUnits = organisationalUnits;
        this.shippingMode = shippingMode;
        this.incoterm = incoterm;
        this.costLineTemplate = costLineTemplate;
        this.effectiveDate = effectiveDate;
        this.costingContextType = costingContextType;
        this.containerType = containerType;
        this.freightForwarder = freightForwarder;
    }

    public CostFormulaSearch() {
        resetFields();
    }

    public List<OrganisationalUnit> getOrganisationalUnits() {
        return organisationalUnits;
    }

    public void setOrganisationalUnits(List<OrganisationalUnit> organisationalUnits) {
        this.organisationalUnits = organisationalUnits;
    }

    // Shortcut methods for the case where there is only one. This makes the UI much easier for now.
    public OrganisationalUnit getOrganisationalUnit() {
        return getOrganisationalUnits().isEmpty() ? null : getOrganisationalUnits().get(0);
    }

    // Shortcut methods for the case where there is only one. This makes the UI much easier for now.
    public void setOrganisationalUnit(OrganisationalUnit organisationalUnit) {
        getOrganisationalUnits().clear();
        getOrganisationalUnits().add(organisationalUnit);
    }

    public void addOrganisationalUnit(OrganisationalUnit organisationalUnit) {
        this.organisationalUnits.add(organisationalUnit);
    }

    public void removeOrganisationalUnit(OrganisationalUnit organisationalUnit) {
        this.organisationalUnits.remove(organisationalUnit);
    }

    public ShippingMode getShippingMode() {
        return shippingMode;
    }

    public void setShippingMode(ShippingMode shippingMode) {
        this.shippingMode = shippingMode;
    }

    public Incoterm getIncoterm() {
        return incoterm;
    }

    public void setIncoterm(Incoterm incoterm) {
        this.incoterm = incoterm;
    }

    public Date getEffectiveDate() {
        return effectiveDate;
    }

    public void setEffectiveDate(Date effectiveDate) {
        this.effectiveDate = effectiveDate;
    }

    @Override
    public String getTableName() {
        return "costformula";
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append("shippingMode", shippingMode)
                .append("incoterm", incoterm).append("costlineTemplate", costLineTemplate).append("effectiveDate", effectiveDate)
                .append("organisationalUnits", organisationalUnits).toString();
    }

    @Override
    public int hashCode() {
        HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
        hashCodeBuilder.append(shippingMode).append(incoterm).append(costLineTemplate).append(effectiveDate)
                .append(costingContextType).append(containerType).append(freightForwarder);
       if(organisationalUnits!=null) {
           for (OrganisationalUnit organisationalUnit : organisationalUnits) {
               hashCodeBuilder.append(organisationalUnit);
           }
       }
        return hashCodeBuilder.toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!HibernateUtils.proxyClassEquals(this, obj)) {
            return false;
        }
        final CostFormulaSearch other = (CostFormulaSearch) obj;
        EqualsBuilder equalsBuilder = new EqualsBuilder();
        equalsBuilder.append(shippingMode, other.shippingMode)
                .append(incoterm, other.incoterm)
                .append(costLineTemplate, other.costLineTemplate)
                .append(effectiveDate, other.effectiveDate)
                .append(costingContextType, other.costingContextType)
                .append(containerType, other.containerType)
                .append(freightForwarder, other.freightForwarder);
        if (organisationalUnits.size() == other.organisationalUnits.size()) {
            for (int i = 0; i < organisationalUnits.size(); i++) {
                OrganisationalUnit thisOrganisationalUnit = organisationalUnits.get(i);
                OrganisationalUnit otherOrganisationalUnit = other.organisationalUnits.get(i);
                equalsBuilder.append(thisOrganisationalUnit, otherOrganisationalUnit);
            }
        } else {
            return false;
        }
        return equalsBuilder.isEquals();
    }

    /**
     * Reset all search fields.
     */
    public void resetFields() {
        // defaults
        // null signifies the ALL option here
        organisationalUnits.clear();
        organisationalUnits.add(null);
        this.shippingMode = ShippingMode.SEA;
        this.incoterm = null;
        this.costLineTemplate = null;
        this.effectiveDate = null;
        this.costingContextType = CostingContextType.IMPORT;
        this.freightForwarder = null;
        this.containerType = null;
    }

    public CostLineTemplate getCostLineTemplate() {
        return costLineTemplate;
    }

    public void setCostLineTemplate(CostLineTemplate costLineTemplate) {
        this.costLineTemplate = costLineTemplate;
    }

    public CostingContextType getCostingContextType() {
        return costingContextType;
    }

    public void setCostingContextType(CostingContextType costingContextType) {
        this.costingContextType = costingContextType;
    }

    public FormulaContainerType getContainerType() {
        return containerType;
    }

    public void setContainerType(FormulaContainerType containerType) {
        this.containerType = containerType;
    }

    public ServiceProvider getFreightForwarder() {
        return freightForwarder;
    }

    public void setFreightForwarder(ServiceProvider freightForwarder) {
        this.freightForwarder = freightForwarder;
    }

    public boolean isExactSearch() {
        return exactSearch;
    }

    public void setExactSearch(boolean exactSearch) {
        this.exactSearch = exactSearch;
    }
}