OrderCallback.java 2.41 KB
/*
 * Copyright Codecrew Ry
 * 
 * All rights reserved.
 * 
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software. 
 * 
 * Any distribution and use in source and binary forms, with or without 
 * modification is not permitted without explicit written permission from the 
 * copyright owner. 
 * 
 * A non-exclusive royalty-free right is granted to the copyright owner of the 
 * Software to use, modify and distribute all modifications to the Software in 
 * future versions of the Software. 
 * 
 */
package fi.codecrew.moya.facade.callbacks;

import java.util.List;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.codecrew.moya.utilities.jpa.FacadeCallback;
import fi.codecrew.moya.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;
	private static final Logger logger = LoggerFactory.getLogger(OrderCallback.class);

	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, Path<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;
		}

		Expression<?> 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 (path.getJavaType().equals(String.class)) {
			path = cb.lower((Expression<String>) path);
		}

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