BaseRateRepository.java

package com.tradecloud.repository.rate.impl;

import com.tradecloud.domain.costing.CostingType;
import com.tradecloud.domain.infrastructure.persistence.CriteriaBuilder;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.rate.RateUnit;
import com.tradecloud.dto.rate.RateSearch;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class BaseRateRepository<T, S> extends RepositoryBaseImpl<T, S> {

    protected List<OrganisationalUnit> findApplicableOrgs(RateSearch search) {
        return findApplicableOrgs(search.getOrganisationalUnit());
    }

    protected List<OrganisationalUnit> findApplicableOrgs(OrganisationalUnit organisationalUnit) {
        List<OrganisationalUnit> toReturn = new ArrayList<OrganisationalUnit>();

        if (organisationalUnit != null) {
            organisationalUnit.getAllOrgUnitsUp(toReturn);
        }

        return toReturn;
    }

    protected DetachedCriteria findOrgTierCriteria(RateSearch search, DetachedCriteria rateCriteria) {
        DetachedCriteria tierCriteria = null;

        if (search.getOrganisationalUnit() != null) {
            DetachedCriteria orgCriteria = rateCriteria.createCriteria("organisationalUnit", CriteriaSpecification.LEFT_JOIN);
            tierCriteria = orgCriteria.createCriteria("tier", CriteriaSpecification.LEFT_JOIN);
        }

        return tierCriteria;
    }

    protected void setRateUnitAndCurrency(RateSearch search, DetachedCriteria criteria) {
        if(search.getCostingType()== CostingType.CLC) {
            RateUnit rateUnit = Optional.ofNullable(search.getRateUnit())
                    .orElseThrow(() -> new IllegalArgumentException(search.getCostLine() + " rateUnit is required"));
            CriteriaBuilder.addDisjunction(criteria, "rateUnit", rateUnit);
            if (search.getCurrency() != null) {
                CriteriaBuilder.addDisjunction(criteria, "currency", search.getCurrency());
                if (search.getRateUnit() != RateUnit.CURRENCY) {
                    throw new IllegalArgumentException(search.getCostLine() + " " + search.getRateUnit() + " is not currency based");
                }
            }
        }
    }

    protected ProjectionList costingProjectionsCommon() {
        return Projections.projectionList()
                .add(Projections.property("id"), "id")
                .add(Projections.property("costLine"), "costLine")
                .add(Projections.property("currency"), "currency")
                .add(Projections.property("effectiveDate"), "effectiveDate")
                .add(Projections.property("rate"), "rate")
                .add(Projections.property("rateUnit"), "rateUnit")
                .add(Projections.property("costingType"), "costingType");
    }

}