UserSearchRepositoryImpl.java

package com.tradecloud.repository.user;

import java.util.List;

import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import org.apache.log4j.Logger;
import org.hibernate.Query;
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 com.tradecloud.authentication.User;
import com.tradecloud.dto.user.UserSearch;
import com.tradecloud.repository.GeneralRepository;
import com.tradecloud.repository.SearchMetaParams;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;

@Repository(value = "userSearchRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class UserSearchRepositoryImpl extends RepositoryBaseImpl<User, UserSearch> implements UserSearchRepository {

    private static final String LIKE = "%";

    private static final long serialVersionUID = 1L;

    private static Logger log = Logger.getLogger(UserSearchRepositoryImpl.class);

    @Autowired
    private GeneralRepository generalRepository;

    @SuppressWarnings("unchecked")
    @Override
    public List<User> search(UserSearch search) {
        String query = addSearchRestrictions(search);
        SearchMetaParams searchMetaParams = search.getSearchMetaParams();
        Query result = getSession().createQuery(query);
        if (null != searchMetaParams) {
            result.setMaxResults(searchMetaParams.getRowCount());
            result.setFirstResult(searchMetaParams.getRowIndex());
        }
        return result.list();
    }

    @SuppressWarnings("unchecked")
    @Override
    public long countByCriteria(UserSearch search) {
        String query = addSearchRestrictions(search);
        Query result = getSession().createQuery(query);
        List<User> userList = result.list();
        long count = userList.size();
        log.debug("Count for Class: User is " + count);
        return count;
    }

    private String addSearchRestrictions(UserSearch search) {
        StringBuilder stringBuilder = new StringBuilder(" from User where enabled = ");
        stringBuilder.append(search.isEnabled() + " ");
        boolean whereClause = true;
        if (search.getUsername() != null) {
            stringBuilder.append(whereClause == true ? " and " : " where ");
            stringBuilder.append("lower(username) like '" + LIKE + search.getUsername().trim().toLowerCase() + LIKE + "'");
            whereClause = true;
        }
        if (search.getOrganisationalUnit() != null) {
            OrganisationalUnit organisationalUnit = generalRepository.findByCode(OrganisationalUnit.class, search.getOrganisationalUnit());

            stringBuilder.append(whereClause == true ? " and " : " where ");

            String organisationalUnits = "";
            for (OrganisationalUnit organisationalUnit1 : organisationalUnit.getChildren()) {
                organisationalUnits += " '" + organisationalUnit1.getCode().trim() + "',";
            }

            organisationalUnits +=" '" + organisationalUnit.getCode()+"'";

            stringBuilder.append("organisationalUnit in (" + organisationalUnits + ")");

            whereClause = true;
        }

        if (search.getFirstName() != null || search.getLastName() != null) {
            if (search.getFirstName() != null) {
                stringBuilder.append(whereClause == true ? " and " : " where ");
                stringBuilder.append("lower(userInfo.firstName) like '" + LIKE + search.getFirstName().trim().toLowerCase() + LIKE + "'");
            }

            if (search.getLastName() != null) {
                stringBuilder.append(whereClause == true ? " and " : " where ");
                stringBuilder.append("lower(userInfo.lastName) like '" + LIKE + search.getLastName().trim().toLowerCase() + LIKE + "'");
            }
        }
        stringBuilder.append(" order by username ");
        return stringBuilder.toString();
    }
}