LeadTimeRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.domain.common.LeadTime;
import com.tradecloud.domain.infrastructure.persistence.CriteriaBuilder;
import com.tradecloud.dto.rate.LeadTimeSearch;
import com.tradecloud.repository.LeadTimeRepository;
import com.tradecloud.repository.base.impl.CriteriaValue;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.apache.log4j.Logger;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.List;

@Repository(value = "leadTimeRepository")
public class LeadTimeRepositoryImpl extends RepositoryBaseImpl<LeadTime, LeadTimeSearch> implements LeadTimeRepository {

    private static final long serialVersionUID = 1L;
    private static Logger log = Logger.getLogger(LeadTimeRepositoryImpl.class);

    @Override
    public List<LeadTime> search(LeadTimeSearch search) {
//        return searchByCriteria(search);
        DetachedCriteria criteria = getDetachedCriteria(search, false);
        return getExecutableCriteriaList(criteria, search.getSearchMetaParams());
    }

//    @Override
//    public LeadTime findBy(PlaceOfLoading placeOfLoading, PlaceOfDischarge placeOfDischarge, ShippingMode shippingMode, City city) {
//        DetachedCriteria criteria = DetachedCriteria.forClass(LeadTime.class);
//        CriteriaBuilder.addEqRestriction(criteria, "placeOfLoading", placeOfLoading);
//        CriteriaBuilder.addEqRestriction(criteria, "placeOfDischarge", placeOfDischarge);
//        CriteriaBuilder.addEqRestriction(criteria, "shippingMode", shippingMode);
//        if(city!=null){
//            CriteriaBuilder.addEqOrNullRestriction(criteria, "city", city);
//
//        }
//        List<LeadTime> leadTimes = criteria.getExecutableCriteria(getSessionCustom()).list();
//        if (!leadTimes.isEmpty()) {
//            return leadTimes.get(0);
//        } else {
//            return null;
//        }
//    }

    @Override
    protected Collection<CriteriaValue> mapFieldsToValues(LeadTimeSearch search) {
//        log.debug("mapFieldsToValues " + search.toString());
//        Collection<CriteriaValue> fields = new LinkedHashSet<CriteriaValue>();
//        fields.add(new CriteriaValue(CriteriaOperation.EQUALS, "shippingMode", search.getShippingMode()));
//        fields.add(new CriteriaValue(CriteriaOperation.EQUALS, "placeOfLoading", search.getPlaceOfLoading()));
//        fields.add(new CriteriaValue(CriteriaOperation.EQUALS, "placeOfDischarge", search.getPlaceOfDischarge()));
//        if(search.isIncludeBlankCity()){
//            fields.add(new CriteriaValue(CriteriaOperation.IN, "city", new Object[]{search.getCity(), null}));
//        }else {
//            fields.add(new CriteriaValue(CriteriaOperation.EQUALS, "city", search.getCity()));
//        }
//        return fields;
        return null;
    }

    @Override
    public long count(LeadTimeSearch search) {
        log.debug("Search. " + search);
        DetachedCriteria criteria = getDetachedCriteria(search, false);
        return getExecutableCriteriaCount(criteria);
    }

    @Override
    public LeadTime lookup(LeadTimeSearch search) {
        DetachedCriteria criteria = getDetachedCriteria(search, true);
        List<LeadTime> leadTimes = getExecutableCriteriaList(criteria, search.getSearchMetaParams());
        if (!leadTimes.isEmpty()) {
            return leadTimes.get(0);
        } else {
            return null;
        }
    }

    private DetachedCriteria getDetachedCriteria(LeadTimeSearch search, boolean includeBlankCity) {
        DetachedCriteria criteria = DetachedCriteria.forClass(LeadTime.class);
        CriteriaBuilder.addEqRestriction(criteria, "placeOfLoading", search.getPlaceOfLoading());

        if (search.getCountry() != null) {
            criteria.createAlias("placeOfLoading", "pl");
            criteria.createAlias("pl.country", "c");

            CriteriaBuilder.addEqRestriction(criteria, "c.code", search.getCountry().getCode());
        }

        CriteriaBuilder.addEqRestriction(criteria, "placeOfDischarge", search.getPlaceOfDischarge());
        CriteriaBuilder.addEqRestriction(criteria, "shippingMode", search.getShippingMode());
        if (includeBlankCity) {
            CriteriaBuilder.addDisjunction(criteria, "city", search.getCity());
        } else {
            CriteriaBuilder.addEqRestriction(criteria, "city", search.getCity());
        }
        return criteria;
    }
}