package org.broadleafcommerce.openadmin.server.service.persistence.module.criteria;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.broadleafcommerce.openadmin.server.dao.DynamicEntityDao;
public class CriteriaTranslatorImplEx extends CriteriaTranslatorImpl implements
CriteriaTranslatorEx {
@Override
public CriteriaQuery<Serializable> translateCriteriaQuery(
DynamicEntityDao dynamicEntityDao, String ceilingEntity,
List<FilterMapping> filterMappings) {
return constructCriteriaQuery(dynamicEntityDao, ceilingEntity,
filterMappings, false);
}
@Override
public CriteriaQuery<Serializable> translateCountCriteriaQuery(
DynamicEntityDao dynamicEntityDao, String ceilingEntity,
List<FilterMapping> filterMappings) {
return constructCriteriaQuery(dynamicEntityDao, ceilingEntity,
filterMappings, true);
}
@SuppressWarnings("unchecked")
protected CriteriaQuery<Serializable> constructCriteriaQuery(
DynamicEntityDao dynamicEntityDao, String ceilingEntity,
List<FilterMapping> filterMappings, boolean isCount) {
CriteriaBuilder criteriaBuilder = dynamicEntityDao
.getStandardEntityManager().getCriteriaBuilder();
Class<Serializable> ceilingMarker;
try {
ceilingMarker = (Class<Serializable>) Class.forName(ceilingEntity);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
Class<?>[] polyEntities = dynamicEntityDao
.getAllPolymorphicEntitiesFromCeiling(ceilingMarker);
Class<Serializable> ceilingClass = (Class<Serializable>) polyEntities[polyEntities.length - 1];
CriteriaQuery<Serializable> criteria = criteriaBuilder
.createQuery(ceilingMarker);
Root<Serializable> original = criteria.from(ceilingClass);
if (isCount) {
criteria.select(criteriaBuilder.count(original));
} else {
criteria.select(original);
}
List<Predicate> restrictions = new ArrayList<Predicate>();
List<Order> sorts = new ArrayList<Order>();
addRestrictions(ceilingEntity, filterMappings, criteriaBuilder,
original, restrictions, sorts);
criteria.where(restrictions.toArray(new Predicate[restrictions.size()]));
if (!isCount) {
criteria.orderBy(sorts.toArray(new Order[sorts.size()]));
}
return criteria;
}
}