package net.techreadiness.persistence.datagrid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import net.techreadiness.persistence.domain.ScopeDO;
import net.techreadiness.service.common.DataGrid;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Scope("prototype")
@Repository
@Transactional(readOnly = true)
public class ScopeItemProviderImpl implements ScopeItemProvider {
@PersistenceContext
private EntityManager em;
private String searchString;
@Override
public List<Map<String, String>> getPage(DataGrid<Map<String, String>> grid) {
TypedQuery<ScopeDO> query = getQuery();
int start = (grid.getPage() - 1) * grid.getPageSize();
query.setFirstResult(start);
query.setMaxResults(grid.getPageSize());
List<ScopeDO> results = query.getResultList();
return createScopeMap(results);
}
@Override
public int getTotalNumberOfItems(DataGrid<Map<String, String>> grid) {
return getQuery().getResultList().size();
}
/**
* Method to get the eligible scopes with parents attached.
*
* @return
*/
private TypedQuery<ScopeDO> getQuery() {
StringBuilder sb = new StringBuilder();
sb.append("select s ");
sb.append("from ScopeDO s ");
sb.append("left join fetch s.parentScope ");
sb.append(" where s.code LIKE :term ");
sb.append(" OR s.name LIKE :term ");
TypedQuery<ScopeDO> query = em.createQuery(sb.toString(), ScopeDO.class);
query.setParameter("term", "%%");
// update search string if it's not null and not empty
if (!StringUtils.isEmpty(searchString)) {
query.setParameter("term", "%" + searchString + "%");
}
return query;
}
/**
* Takes a list of ScopeDO objects and appends their attributes to a map and also attaches the parent code and name for
* display purposes.
*
* @param entities
* @return
*/
private static List<Map<String, String>> createScopeMap(List<ScopeDO> entities) {
List<Map<String, String>> maps = new ArrayList<>();
for (ScopeDO scopeDO : entities) {
Map<String, String> map = scopeDO.getExtAttributes();
if (scopeDO.getParentScope() != null) {
map.put("parentCode", scopeDO.getParentScope().getCode());
map.put("parentName", scopeDO.getParentScope().getName());
}
maps.add(map);
}
return maps;
}
@Override
public void setSearchCriteria(String searchString) {
this.searchString = searchString;
}
}