StaticDataSearchRepositoryImpl.java

package com.tradecloud.repository.staticdata;

import com.tradecloud.common.base.StaticDataEntityBase;
import com.tradecloud.dto.base.PlaceOfCustomsSearch;
import com.tradecloud.dto.base.StaticDataSearch;
import com.tradecloud.repository.GeneralRepository;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Repository(value = "staticDataSearchRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class StaticDataSearchRepositoryImpl extends RepositoryBaseImpl<StaticDataEntityBase, StaticDataSearch>
        implements StaticDataSearchRepository {

    private static final long serialVersionUID = 1L;

    private static final Logger log = Logger.getLogger(StaticDataSearchRepositoryImpl.class);

    @Autowired
    private GeneralRepository generalRepository;

    @SuppressWarnings("unchecked")
    @Override
    public List<StaticDataEntityBase> search(StaticDataSearch search) {

        DetachedCriteria criteria = null;

        try {
            criteria = DetachedCriteria.forClass(Class.forName(search.getTableName()));
            criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        // criteria.addOrder(Order.asc("name"));
        // criteria.addOrder(Order.asc("id"));

        // search.getSearchMetaParams().setOrderBy("id");
        addSearchRestrictions(criteria, search);

        List<StaticDataEntityBase> staticDataList = getExecutableCriteriaList(criteria, search.getSearchMetaParams(), "name", true);

        return staticDataList;
    }

    @SuppressWarnings("unchecked")
    @Override
    public long countByCriteria(StaticDataSearch search) {
        DetachedCriteria criteria = null;

        try {
            criteria = DetachedCriteria.forClass(Class.forName(search.getTableName()));
            criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        // criteria.addOrder(Order.asc("name"));

        addSearchRestrictions(criteria, search);
        long count = getExecutableCriteriaCount(criteria);
        return count;
    }

    private void addSearchRestrictions(DetachedCriteria criteria, StaticDataSearch search) {
        log.debug("addSearchRestrictions " + search.toString());
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

        if (search.getName() != null && search.getName().trim().length() > 0) {
            criteria.add(Restrictions.ilike("name", LIKE + search.getName() + LIKE));
        }

        if (search.getCode() != null && search.getCode().trim().length() > 0) {
            criteria.add(Restrictions.ilike("code", LIKE + search.getCode() + LIKE));
        }

        if (search.getCountry() != null) {
            criteria.add(Restrictions.eq("country", search.getCountry()));
        }

        if (search.getTableName().equals("com.tradecloud.domain.place.PlaceOfCustom") || search.getTableName().equals("PlaceOfCustom")) {
            PlaceOfCustomsSearch placeOfCustomsSearch = (PlaceOfCustomsSearch) search;
            if (placeOfCustomsSearch.getPlaceOfCustomType() != null) {
                criteria.add(Restrictions.eq("type", placeOfCustomsSearch.getPlaceOfCustomType()));
            }
        }

        if (search.getTableName().equals("com.tradecloud.domain.place.FinalDestination") || search.getTableName().equals("FinalDestination")) {
            if (CollectionUtils.isNotEmpty(search.getOrganisationalUnitList())) {
                criteria.createAlias("organisationalUnits", "organisationalUnit");
                criteria.add(Restrictions.in("organisationalUnit", search.getOrganisationalUnitList()));
            } else if (search.getOrganisationalUnit() != null) {
                criteria.createAlias("organisationalUnits", "organisationalUnit");
                criteria.add(Restrictions.eq("organisationalUnit.id", search.getOrganisationalUnit().getId()));
            }
        }
    }
}