OrderCallback.java 1.46 KB
package fi.insomnia.bortal.facade.callbacks;

import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;

import fi.insomnia.bortal.utilities.jpa.ModelInterface;

public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T> {

	private final SingularAttribute<? super T, ?> sort;
	private final boolean asc;
	private String sortstr;

	public OrderCallback(boolean asc, SingularAttribute<? super T, ?> sortAttr) {
		sort = sortAttr;
		this.asc = asc;
	}

	public OrderCallback(boolean asc2, String sort2) {
		this.asc = asc2;
		sortstr = sort2;
		sort = null;

	}

	@Override
	public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, T> root, List<Predicate> predicates) {

		Class<?> rettype = cq.getResultType();
		// Check if returntype is entity or are we for example counting results
		if (!ModelInterface.class.isAssignableFrom(rettype))
		{
			return;
		}

		Path<?> path = null;
		if (sort == null) {
			if (sortstr == null) {
				return;
			}
			try {
				path = root.get(sortstr);
			} catch (IllegalArgumentException e) {
				path = null;
			}
		} else {
			path = root.get(sort);
		}
		if (path == null) {
			return;
		}

		if (asc) {
			cq.orderBy(cb.asc(path));
		} else {
			cq.orderBy(cb.desc(path));
		}
	}
}