package com.metrink.croquet.examples.crm.data; import java.util.Iterator; import javax.annotation.Nullable; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; /** * An extension of {@link GenericDataProvider} that is specialized for {@link PeopleBean}s. */ public class PeopleDataProvider extends GenericDataProvider<PeopleBean> { private static final long serialVersionUID = 3045313935791682897L; private static final Logger LOG = LoggerFactory.getLogger(PeopleDataProvider.class); private final Integer companyId; @Inject PeopleDataProvider(final EntityManager entityManager, @Nullable @Assisted final Integer companyId) { super(entityManager, PeopleBean.class); this.companyId = companyId; } @Override public Iterator<? extends PeopleBean> iterator(final long first, final long count) { final EntityManager entityManager = getEntityManager(); entityManager.getTransaction().begin(); try { final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); final CriteriaQuery<PeopleBean> criteria = criteriaBuilder.createQuery(PeopleBean.class); final Root<PeopleBean> from = criteria.from(PeopleBean.class); // add the criteria if we have one if(companyId != null) { criteria.where(criteriaBuilder.equal(from.get("company"), companyId)); } // setup the sort final SortParam<String> param = getSort(); if(param == null || param.isAscending()) { LOG.debug("Setting order by to ascending for PeopleBean"); criteria.orderBy(criteriaBuilder.asc(from.get("name"))); } else { LOG.debug("Setting order by to descending for PeopleBean"); criteria.orderBy(criteriaBuilder.desc(from.get("name"))); } return entityManager.createQuery(criteria) .setFirstResult((int)first) .setMaxResults((int)count) .getResultList() .iterator(); } finally { entityManager.getTransaction().commit(); } } @Override public long size() { final EntityManager entityManager = getEntityManager(); // add the criteria if we have one (not as elegant as the one above) if(companyId != null) { return entityManager .createQuery("select count(*) from PeopleBean where COMPANYID = " + companyId, Long.class) .getSingleResult(); } else { return entityManager.createQuery("select count(*) from PeopleBean", Long.class) .getSingleResult(); } } /** * Factory class for the {@link PeopleDataProvider}. */ public interface PeopleDataProviderFactory { /** * Factory method for creating a new {@link PeopleDataProvider}. * @param companyId company to filter on, or null for everything. * @return an {@link PeopleDataProvider}. */ public PeopleDataProvider create(final Integer companyId); } }