package net.techreadiness.customer.datagrid;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import net.techreadiness.persistence.dao.ContactTypeDAO;
import net.techreadiness.persistence.domain.ContactDO;
import net.techreadiness.persistence.domain.ContactTypeDO;
import net.techreadiness.service.common.DataGrid;
import net.techreadiness.service.object.Org;
import net.techreadiness.service.object.Scope;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@Component
@org.springframework.context.annotation.Scope("prototype")
@Transactional(readOnly = true)
public class OrgContactTaskItemProviderImpl implements OrgContactTaskItemProvider {
@PersistenceContext
private EntityManager em;
private Org org;
private Scope scope;
@Inject
private ContactTypeDAO contactTypeDao;
@Override
public int getTotalNumberOfItems(DataGrid<Map<String, String>> grid) {
if (org != null) {
TypedQuery<ContactDO> query = getQuery();
return query.getResultList().size();
}
return 0;
}
@Override
@Transactional(readOnly = true)
public List<Map<String, String>> getPage(DataGrid<Map<String, String>> grid) {
int start = (grid.getPage() - 1) * grid.getPageSize();
List<Map<String, String>> results = Lists.newArrayList();
if (org != null) {
TypedQuery<ContactDO> query = getQuery();
query.setFirstResult(start);
query.setMaxResults(grid.getPageSize());
List<ContactDO> contacts = query.getResultList();
Map<ContactTypeDO, ContactDO> contactMap = Maps.newHashMap();
for (ContactDO contact : contacts) {
contactMap.put(contact.getContactType(), contact);
}
List<ContactTypeDO> contactTypes = contactTypeDao.findContactTypesForScope(scope.getScopeId());
for (ContactTypeDO contactType : contactTypes) {
Map<String, String> row = Maps.newHashMap();
if (contactMap.containsKey(contactType)) {
ContactDO contact = contactMap.get(contactType);
row.putAll(contact.getAsMap());
}
row.put("contactTypeId", contactType.getContactTypeId().toString());
row.put("contactTypeName", contactType.getName());
row.put("orgId", org.getOrgId().toString());
results.add(row);
}
}
return results;
}
private TypedQuery<ContactDO> getQuery() {
StringBuilder sb = new StringBuilder();
sb.append("select c ");
sb.append("from ContactDO c ");
sb.append("where c.org.orgId = :orgId");
TypedQuery<ContactDO> query = em.createQuery(sb.toString(), ContactDO.class);
query.setParameter("orgId", Long.valueOf(org.getOrgId().toString()));
return query;
}
@Override
public void setOrg(Org org) {
this.org = org;
}
@Override
public void setScope(Scope scope) {
this.scope = scope;
}
}