dk.fambagge.recipes.web.data.LazyCustomList.java Source code

Java tutorial

Introduction

Here is the source code for dk.fambagge.recipes.web.data.LazyCustomList.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package dk.fambagge.recipes.web.data;

import dk.fambagge.recipes.db.Database;
import dk.fambagge.recipes.db.DomainObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.hibernate.query.Query;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author gof
 */
public class LazyCustomList<T extends DomainObject> extends LazyDataModel<T> {

    private String customFilter;
    private Map<String, Object> filterMap;
    private final Class<T> domainClass;

    public LazyCustomList(Class<T> domainClass) {
        this.domainClass = domainClass;
    }

    @SuppressWarnings("Duplicates")
    @Override
    public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder,
            Map<String, Object> filters) {

        List<T> results = new ArrayList<>();

        filterMap = new HashMap<>();

        if (filters != null) {
            filterMap.putAll(filters);
        }

        if (customFilter != null) {
            filterMap.put("name", customFilter);
        }

        Database.execute((session) -> {
            CriteriaBuilder builder = session.getCriteriaBuilder();

            CriteriaQuery<Long> criteriaCount = builder.createQuery(Long.class);
            Root<T> rootCount = criteriaCount.from(domainClass);

            Predicate[] predicatesCount = new Predicate[filterMap.size()];

            //Setup filters
            int i = 0;
            for (Entry<String, Object> entry : filterMap.entrySet()) {
                String filterField = entry.getKey();
                String filterValue = entry.getValue().toString();

                predicatesCount[i] = builder.like(builder.lower(rootCount.get(filterField)),
                        "%" + filterValue.toLowerCase() + "%");
                i++;
            }

            criteriaCount.select(builder.count(rootCount));
            criteriaCount.where(predicatesCount);

            int count = session.createQuery(criteriaCount).uniqueResult().intValue();

            this.setRowCount(count);

            CriteriaQuery<T> criteria = builder.createQuery(domainClass);
            Root<T> root = criteria.from(domainClass);

            Predicate[] predicates = new Predicate[filterMap.size()];

            //Setup filters
            i = 0;
            for (Entry<String, Object> entry : filterMap.entrySet()) {
                String filterField = entry.getKey();
                String filterValue = entry.getValue().toString();

                predicates[i] = builder.like(builder.lower(root.get(filterField)),
                        "%" + filterValue.toLowerCase() + "%");
                i++;
            }

            criteria.select(root);
            criteria.where(predicates);

            String sortFieldFixed = sortField == null ? "name" : sortField;
            SortOrder sortOrderFixed = sortOrder == null ? SortOrder.ASCENDING : sortOrder;

            switch (sortOrderFixed) {
            case ASCENDING:
                criteria.orderBy(builder.asc(root.get(sortFieldFixed)));
                break;
            case DESCENDING:
                criteria.orderBy(builder.desc(root.get(sortFieldFixed)));
                break;
            }

            Query<T> query = session.createQuery(criteria);
            query.setFirstResult(first);
            query.setMaxResults(pageSize);

            results.addAll(query.getResultList());
        });

        return results;
    }

    /**
     * @return the filter
     */
    public String getFilter() {
        return customFilter;
    }

    /**
     * @param filter the filter to set
     */
    public void setFilter(String filter) {
        this.customFilter = filter;
    }
}